Windows提供了一个模拟键盘API函数Keybd_event(),使用该函数可以相应的屏蔽键盘的动作。Keybd_event()函数能触发一个按键事件,也就是说会产生一个WM_KEYDOWN或WM_KEYUP消息。

该函数原型如下:

VOID keybd_event(

BYTE bVk, // virtual-key code

BYTE bScan, // hardware scan code

DWORD dwFlags, // flags specifying various function options

DWORD dwExtraInfo // additional data associated with keystroke

);

从原型可以看出,Keybd_event()共有四个参数:

  第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab(其他具体的参见附录:常用模拟键的键值对照表);第二个参数为扫描码,一般不用设置,用0代替就行;第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP";第四个参数一般也是置0即可。

例子1:模拟按下’A’键
   keybd_event(65,0,0,0);
   keybd_event(65,0,KEYEVENTF_KEYUP,0);

例子2:模拟按下’ALT+F4’键
   keybd_event(18,0,0,0);
   keybd_event(115,0,0,0);
   keybd_event(115,0,KEYEVENTF_KEYUP,0);
   keybd_event(18,0,KEYEVENTF_KEYUP,0);

附:常用模拟键的键值对照表(也可参考http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx)

                                                     键盘键与虚拟键码对照表

字母和数字键 数字小键盘的键功能键 其它键
      键   键码   键   键码    键   键码    键    键码
      A   65   0   96     F1   112   Backspace    8
      B   66   1   97     F2   113   Tab       9
      C   67    2   98     F3   114   Clear      12
      D   68   3   99     F4   115  Enter      13
      E   69    4   100    F5   116  Shift      16
      F   70    5   101    F6   117  Control     17
      G   71    6   102    F7   118   Alt       18
      H   72    7   103    F8   119  Caps Lock    20
      I   73    8   104    F9   120  Esc       27
      J   74    9   105    F10  121  Spacebar    32
      K   75    *   106    F11  122  Page Up     33
      L   76    +   107    F12  123  Page Down    34
      M   77    Enter 108    –   –   End       35
      N   78    -   109    –   –    Home      36
      O   79    .   110    –   –     Left Arrow   37
      P   80    /   111    –   –     Up Arrow    38
      Q   81    –   –     –   –     Right Arrow   39
      R   82    –   –    –   –      Down Arrow    40
      S   83    –   –     –   –     Insert      45
      T   84    –   –     –   –     Delete      46
      U   85    –   –     –   –     Help       47
      V   86    –   –    –   –     Num Lock     144
      W   87          
      X   88      
      Y   89      
      Z   90      
      0   48      
      1   49      
      2   50       
      3   51       
      4   52       
      5   53       
      6   54       
      7   55       
      8   56       
      9   57

模拟键盘平时不是很常用, 但是当调用某些快捷键执行某项功能时, 它真的是那么的方便呀. 你不信? 看看下面的实现, 你就会大呼: 为什么不早点告诉我? 呵呵, 原来没有blog呀, 都靠这些挣分呢.

  1. 显示桌面:

      很多软件有显示桌面的功能, 并且大家的方法都是遍历窗口,  然后让它们最小化, 其实 win系统给咱们了一个非常方便的WIN键(就是键盘上在CTRL键和ALT键之间的那个带win标志的按键), 利用它, 可以轻松的完成显示桌面的功能.
    

    keybd_event(VK_LWIN, 0, 0 ,0);
    keybd_event(‘M’, 0, 0 ,0);
    keybd_event(‘M’, 0, KEYEVENTF_KEYUP ,0);
    keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);

其他的操作也类似, 比如直接显示开始的运行,就把上面的’M’换成’R’即可。

直接 keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);

直接显示“开始”对话框了。

  1. 实现快速的全选

     很多的时候,比如listctrl实现全选,你可以用listctrl循环设置每一项的状态为选中,多罗索的事情呀。用快捷键试一试CTRL+A,其他的快捷键一样的用法,呵呵,你知道怎么办了吧?
    

    keybd_event(VK_CONTROL, (BYTE)0, 0 ,0);
    keybd_event(‘A’,(BYTE)0, 0 ,0); //此处可以用 ‘A’, (BYTE)65, 用’a’不起作用.
    keybd_event(‘A’, (BYTE)0, KEYEVENTF_KEYUP,0);
    keybd_event(VK_CONTROL, (BYTE)0, KEYEVENTF_KEYUP,0);

  2. 执行某些特殊的键,比如数字键,大小写,下面是数字键的例子

    bool bState=true; //true为按下NumLock,false反之
    BYTE keyState[256];

    GetKeyboardState((LPBYTE)&keyState);
    if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
    (!bState && (keyState[VK_NUMLOCK] & 1)) )
    {
    // Simulate a key press
    keybd_event( VK_NUMLOCK,
    0x45,
    KEYEVENTF_EXTENDEDKEY | 0,
    0 );

     // Simulate a key releasekeybd_event( VK_NUMLOCK,0x45,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
    

    }

4) 你想CTRL+ALT+DELETE三键一起按下,

keybd_event(VK_CONTROL, 0, 0 ,0);
keybd_event(VK_MENU,0, 0 ,0);
keybd_event(VK_DELETE,0, 0 ,0);keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_MENU,0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_DELETE,0, KEYEVENTF_KEYUP ,0);

呵呵,这样不会成功呀,因为这几个键直接是操作系统来截获执行的,而模拟键盘只能发向应用程序,所以这种方法不行的(想显示锁定对话框,用 LockWorkStation();)

5) Window2000/NT/XP已经不提倡用这个函数了,上面的方法只是为了让大家开阔一下思路,怎么替代呢,呵呵,看下面,所以上面的所有代码都可以用这个来完成

//2000下用这个代替 ,包含 “winable.h”
INPUT input[4];
memset(input, 0, sizeof(input));

input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;input[0].ki.wVk  = input[3].ki.wVk = VK_LWIN;
input[1].ki.wVk  = input[2].ki.wVk = 'R';//接下来释放它,这一点很重要。
input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;
input[0].ki.time = input[1].ki.time = input[2].ki.time = input[3].ki.time = GetTickCount();SendInput(4, input, sizeof(INPUT));

感觉比那个有点罗索,呵呵。

====================

附WIN键的部分快捷键:

WIN键+D=快速的切到桌面,再次点击返回

WIN键+E=快速打开资源管理器

WIN键+R=“运行”。

WIN键+M=全部视窗最小化。

WIN键+Shift+M=取消全部视窗最小化。

WIN键+F1=Help。

WIN键+F=“寻找”。

WIN键+Ctrl+F=显示“查找电脑”。

WIN键+Tab=切换工作列的程式。

WIN键+Break=显示系统内容。


                      关于SendMessage keybd_event  PostMessage

首先你会发现keybd_event函数中是没有窗口句柄作为参数的,好奇的你一定会觉得很奇怪,那是因为,keybd_event是全局模拟按键的,只对前台窗口(即当前的活动窗口)才可以,但是如果模拟的按键正好也是某个窗口的全局热键消息,那该窗口也能接收到的

而SendMessage 、PostMessage是对指定句柄窗口都其作用的,对于做一些一外挂是非常有用的。例如可以做成这样的效果:即用SendMessage/PostMessage在某一个窗口模拟动作,而同时自己可以在其他窗口做其他事情,互不影响的!

但是有一点要注意,很多人在模拟键盘消息的时候,都会忘记模拟WM_KEYUP的消息。。。

还有一点就是,PostMessage中的窗口句柄参数,可以设置为HWND_BROADCAST,即广播,但不要理所当然地认为是对所有的窗口都起作用!!!它只对系统的顶层窗口起作用,子窗口是收不到这个消息的!!!

还要注意的是SendMessage是没有HWND_BROADCAST参数的,那是因为,SendMessage总是等发送的消息在对应的窗口消息队列中处理完毕后才返回的(这是一种负责的行为), 细想一下就知道为什么SendMessage没有HWND_BROADCAST参数了!!

个人认为

1. 当需要模拟键盘输入命令时,比如Ctrl + V,选择keybd_event;

2. 当需要模拟键盘输入一串字符时,选择PostKeybdMessage;

3. 当需要模拟键盘输入单个字符时,选择keybd_event。

SendMessage(Button.Handle,WM_LBUTTONDOWN,0,0);  鼠标左键按下
SendMessage(Button.Handle,WM_LBUTTONUP,0,0);   鼠标左键抬起
SendMessage(Edit.Handle,WM_SETTEXT,255,Integer(PChar(‘abc’))); 传递文本
SendMessage(Edit.Handle,WM_Char,Wparam(‘Q’),2);  传递字符
SendMessage(Button.Handle,BM_SETSTYLE,BS_RADIOBUTTON,1);  改变Button风格
SendMessage(ComboBox.Handle,CB_SETDROPPEDWIDTH,300,0);  改变CBDownWidth
WM_CUT、WM_COPY和WM_PASTE  剪切,复制,粘帖

实现任意组合键
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);
keybd_event(ord(‘V’), MapVirtualKey(ord(‘V’), 0), 0, 0);
keybd_event(ord(‘V’), MapVirtualKey(ord(‘V’), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);

模拟鼠标按下事件
::PostMessage(hwd0,WM_MOUSEMOVE, MK_LBUTTON, MAKELONG(x,y));
::PostMessage(hwd0,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(x,y));
::PostMessage(hwd0,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(x,y));

模拟键盘按下事件
keybd_event(VK_TAB,0,0,0);
keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);

转自:https://blog.csdn.net/zhanglidn013/article/details/35988381

python实现键盘自动输入相关推荐

  1. python实现键盘自动输入_人生苦短我用Python——模拟鼠标点击和键盘输入的操作...

    通过Python可以模拟鼠标点击和键盘输入的操作,进而可以实现一些比较有趣的功能,例如游戏挂机.自动发消息等. 本文以自动发消息为例,实现该功能,通过该代码可以自动往QQ.微信发送任意内容.首先考虑想 ...

  2. python从键盘获取输入并排序_python从键盘输入数字并排序-女性时尚流行美容健康娱乐mv-ida网...

    女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页 > 高级搜索 python 读取 键盘 输入 ...

  3. python 在软件自己自动输入-Python模拟百度自动输入搜索功能的实例

    如下所示: # 访问百度,模拟自动输入搜索 # 代码中引入selenium版本为:3.4.3 # 通过Chrom浏览器访问发起请求 # Chrom版本:59 ,chromdriver:2.3 # 需要 ...

  4. 模拟键盘自动输入VBS

    vbs 模拟键盘输入:http://www.51testing.com/html/45/402645-250304.html windows下模拟键盘自动输入

  5. 怎样在python代码中输入π_鼠标自动点击、键盘自动输入?几行Python代码搞定

    相信我,你以后一定会用到.实在不行,你先收藏,做个收藏家,等拿出来,就值钱了. 第一步:安装并导入相关模块 只需要安装PyUserInput,如下: pip install PyUserInput 如 ...

  6. python实现软件自动点击_鼠标自动点击、键盘自动输入?几行Python代码搞定

    第一步:安装并导入相关模块 只需要安装PyUserInput,如下:pip install PyUserInput 如果你是Win10系统,肯定会报错,具体怎么解决,我放在文章结尾讲,先把主要思路讲完 ...

  7. python从键盘上输入10个整数、输出奇数和_数据库 从键盘上输入10个整数型的数值,分别统计奇数和偶数的个数...

    从键盘上输入10个整数,并求出这10个数中所有奇数的和与所有偶数之和要求:分别用while,do ...while #includelongmain(void){\x05longa[10]={0};\ ...

  8. Python从键盘中输入一个列表

    从键盘上输入一个列表,在键盘上输入形式:[1,2,3,5,6] 直接上代码 x = input() x = x.strip('[') x = x.strip(']') xlist = x.split( ...

  9. python从键盘上输入五个数字打一成语_python实现成语填字游戏 自动生成题目

    开心!先来个成果图记录一下,之前一直觉得很神奇,自动生成题目的算法是怎样的,好奇着好奇着就去试试,其实好像也不涉及到啥算法,摸索着总算弄出来啦,大神莫笑小白之欢喜. image.png 代码还没整理好 ...

  10. 模拟键盘自动输入英文——基于pykeyboard和pymouse

    之前学校老师布置了一个英语作文,需要在某网站上在线作答,同时还开启了禁止复制粘贴的功能.为了偷懒,便参考网上其他帖子自己写了一个脚本,后面还用tkinter添加了界面,以造福其他不太懂cmd的同学,不 ...

最新文章

  1. 西农大许金荣课题组在小麦赤霉病研究领域取得重要突破
  2. Springcloud Feign原理
  3. 《等离子体所毕业生经验分享会》观后感 2020-07-03
  4. OpenCV图像锐化/增强
  5. javax.ws.rs.NotSupportedException: Cannot consume content type
  6. 不连续字符的串计数(洛谷P4439题题解,Java语言描述)
  7. 总奖金100万!2021SEED江苏大数据开发与应用大赛(华录杯)正式开赛!
  8. unity 学习记录
  9. java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection 解决
  10. docker mysql 高可用_使用docker 基于pxc镜像搭建mysql高可用集群
  11. 安装autocad2006出错
  12. 教你写一个弹幕库,确定不了解一下?,请查收
  13. 微软官方出的各种dll丢失的修复工具
  14. Mysql及SQLyog安装教程
  15. IEEE Xtreme 11.0极限编程题目分类
  16. mysql analyze_技术分享 | MySQL EXPLAIN ANALYZE
  17. 个性和共性,对共性的封装。新的语言是如何诞生的
  18. excel怎么按照年月日时分秒的格式以每隔一个小时进行填充序列
  19. 最新!2020中国高校毕业生薪资排行出炉!
  20. 24339 Problem B 采药

热门文章

  1. c++ 11/14新特性
  2. webservice调用数据库
  3. 聚合物/硅胶色谱填粒径1.7μm到50μm
  4. 计算机网络-名词解释整理
  5. 友达37寸长条液晶屏P370IVN04.1-原厂长条屏
  6. 微信小程序自定义侧滑删除组件
  7. python数据挖掘电影评分分析_豆瓣电影数据与票房数据分析
  8. php 按照laravel5.5,laravel5.5 安装
  9. 前端页面点击姓名查看详情
  10. 【杭电5053】the Sum of Cube