模拟鼠标键盘

来源:互联网 发布:c语言的自定义函数 编辑:程序博客网 时间:2024/06/05 05:53

一、用处

模拟鼠标键盘这个功能的作用非常多,这里简单举几个例子:

1)简单的游戏外挂

2)工作中自动化实现等需要进行的鼠标点击等操作

3)简单的聊天机器人等

二、实现原理

在windows下模拟鼠标的话,咨询Win32各种库吧,这里python中对应的库就是pywin32库啦。

http://sourceforge.net/projects/pywin32/

下载安装后,在安装的python对应目录下的Lib\site-packages\win32\Demos中可以找打大部分例子。

1、对窗口的操作

 通过名字可以找到对话框的句柄:

    dlg = win32gui.FindWindow(None,'Windowname')
    获取对话框句柄后,可以掉用ShowWindow函数将对话框进行显示    win32gui.ShowWindow(dlg,win32con.SW_RESTORE)    # 这个函数可以进行移动对话框    win32gui.MoveWindow(dlg,0,0,0,0,1)    # 激活对话框,将对话框显示在最前面    win32gui.SetForegroundWindow(dlg)

2、对鼠标的操作函数

int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); 

参数 意义 
dwFlags Long,下面标志之一或它们的组合 
dx,dy Long,根据MOUSEEVENTF_ABSOLUTE标志,指定x,y方向的绝对位置或相对位置 
cButtons Long,没有使用 
dwExtraInfo Long,没有使用 

dwFlags常数 意义 

const int MOUSEEVENTF_MOVE = 0x0001;      移动鼠标 
const int MOUSEEVENTF_LEFTDOWN = 0x0002; 模拟鼠标左键按下 
const int MOUSEEVENTF_LEFTUP = 0x0004; 模拟鼠标左键抬起 
const int MOUSEEVENTF_RIGHTDOWN = 0x0008; 模拟鼠标右键按下 
const int MOUSEEVENTF_RIGHTUP = 0x0010; 模拟鼠标右键抬起 
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; 模拟鼠标中键按下 
const int MOUSEEVENTF_MIDDLEUP = 0x0040; 模拟鼠标中键抬起 
const int MOUSEEVENTF_ABSOLUTE = 0x8000; 标示是否采用绝对坐标 


如果模拟鼠标一次点击可以用如下代码:
mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 

模拟鼠标右键单击事件: 
mouse_event (MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 ) 

两次连续的鼠标左键单击事件 构成一次鼠标双击事件: 
mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 
mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 

另外,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,

如果dx,和dy,用0,0表示,这函数认为是当前鼠标所在的点。


3、对键盘的操作

VOID keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,DWORD dwExtralnfo);
  参数:
  bVk:定义一个虚拟键码。键码值必须在1~254之间。
  bScan:定义该键的硬件扫描码。
  dwFlags:定义函数操作的各个方面的一个标志位集。应用程序可使用如下一些预定义常数的组合设置标志位。
         KEYEVENTF_EXTENDEDKEY:若指定该值,则扫描码前一个值为OXEO(224)的前缀字节。
         KEYEVENTF_KEYUP:若指定该值,该键将被释放;若未指定该值,该键将被按下。
  dwExtralnfo:定义与击键相关的附加的32位值。
  返回值:该函数无返回值。


键位码表:
字母和数字键     数字小键盘的键       功能键         其它键 
      键   键码   键   键码     键   键码    键      键码 
      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


三、代码实例

模拟鼠标点击,这里找出来和萌萌聊天的QQ对话框,然后将其关闭
关于查找坐标可以事先模拟一下,然后通过上一篇鼠标键盘监控中的代码获取具体的坐标
#-*- coding:gb2312-*-import win32con,win32gui,win32api #pos=(x,y) x,y is cursor's coordinatedef mouse_click(pos):    win32api.SetCursorPos(pos)    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | win32con.MOUSEEVENTF_LEFTUP,0,0,0,0)if __name__ == "__main__":    dlg = win32gui.FindWindow(None, '天然萌')    win32gui.ShowWindow(dlg, win32con.SW_RESTORE)    mouse_click((865,158))


模拟键盘点击,自动和萌萌聊扣扣的机器人,下面坐标是通过上篇文章中pyHook获取的坐标。
a键按下,a键抬起,可以输入一个a字,然后输入回车即可。

#-*- coding:gb2312-*-import win32con,win32gui,win32api if __name__ == "__main__":    dlg = win32gui.FindWindow(None, '天然萌')    win32gui.ShowWindow(dlg, win32con.SW_RESTORE)    win32gui.SetForegroundWindow(dlg)    win32api.SetCursorPos((397,580))    win32api.keybd_event(65,0,0,0);    win32api.keybd_event(65,0,win32con.KEYEVENTF_KEYUP,0);    win32api.keybd_event(13,0,0,0);    win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0);

《完》