工作生活

win操作(1)-键盘鼠标输入

2019-07-03  本文已影响0人  瓜T_T

python比较底层的鼠标键盘操作使用win32api包,使用这个包需要win32con配合,后者封装了几乎所有windos操作定义的宏,比如:

image.png

鼠标操作

void mouse_event(
  DWORD     dwFlags,
  DWORD     dx,
  DWORD     dy,
  DWORD     dwData,
  ULONG_PTR dwExtraInfo
);

第一个参数dwflags

MOUSEEVENTF_ABSOLUTE 是否启用绝对坐标唯一一个需要配合其他状态使用的值
MOUSEEVENTF_LEFTDOWN 按下鼠标左键
MOUSEEVENTF_LEFTUP 放开鼠标左键
MOUSEEVENTF_MIDDLEDOWN 按下中间键
MOUSEEVENTF_MIDDLEUP 放开中间键
MOUSEEVENTF_MOVE 鼠标移动
MOUSEEVENTF_RIGHTDOWN 按下右键
MOUSEEVENTF_RIGHTUP 放开右键
MOUSEEVENTF_XDOWN 扩展键按下一些鼠标有侧键具体看鼠标驱动
MOUSEEVENTF_XUP 扩展键放开一些鼠标有侧键具体看鼠标驱动
MOUSEEVENTF_WHEEL 正向滚
MOUSEEVENTF_HWHEEL 方向滚

第二个参数是x坐标
第三个参数是y坐标
第四个参数是一般是配合 MOUSEEVENTF_WHEEL使用,默认值是120代表一滚多少距离,负数值是反向滚
第五个参数一般不需要用到,代表一下扩展信息,32位,十分不常用

鼠标单击

def mouse_left_click():
    """
        封装鼠标点击
    """
    
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0)
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0)  

一般教程会告诉你鼠标操作包括按下和放开,然后后面的那四个参数不重要,记住这样用就可以了(-_-不重要~)。强迫症的人会纠结x,y的值为什么0是代表当前鼠标的位置,而不是绝对值(0,0);后面那两位0,0又是不是某个win32con定义的常量?但是如果他们这样举例可能就比较清晰明白了。

def mouse_left_click_false():
    """
        封装鼠标点击
    """
    
    mouse_event(MOUSEEVENTF_LEFTDOWN,False,False)
    mouse_event(MOUSEEVENTF_LEFTUP,False,False)  

没错包括后面要讲到的keybd_event但不仅限于它,很多常量仅仅是代表布尔值False,代表不要求这参数(这才是一堆0的意义,它一般是取默认值或者当前值的意思)

键盘操作

void keybd_event(
  BYTE      bVk,
  BYTE      bScan,
  DWORD     dwFlags,
  ULONG_PTR dwExtraInfo
);

第一个参数是vk_code是按键映射的编码
https://docs.microsoft.com/zh-cn/windows/desktop/inputdev/virtual-key-codes
各个按键对应的vk_code可以看上面的网址。
第二个参数是扫描码,又是一个映射级别的编码,一般教程会说可以设为0(但是这里同样是False的意思)

UINT MapVirtualKeyA(
  UINT uCode,
  UINT uMapType
);

这个编码可以通过win32api.MapVirtualKeyA函数模拟,uMapType一般选0代表MAPVK_VK_TO_VSC,还有其他值,意思看英文可以猜到。
MAPVK_VK_TO_CHAR -> 2
MAPVK_VSC_TO_VK -> 1
MAPVK_VSC_TO_VK_EX -> 3
第三个参数代表操作,有KEYEVENTF_EXTENDEDKEY(1)和KEYEVENTF_KEYUP(2)两种模式,第一种代表一直按住该键,注意这里是一直按住,即使后面紧跟着keyup也不会生效,第二种就是名字的意思了,就是放开按键。其实这里还有第三种默认参数,就是当这个值等于False的时候,代表按下按键,这种按下是可以keyup的,所以经常会见到这样写代表某个按键的输入操作。

keybd_event(vk_code,0,0,0)
keybd_event(vk_code,0,KEYEVENTF_KEYUP,0)

第四个参数是扩展参数,基本不是写原生C的话可以不考虑这个参数了。完整的键盘模拟操作如下:

keybd_event(vk_code,win32api.MapVirtualKeyA(vk_code,win32con.MAPVK_VK_TO_VSC),False)
keybd_event(vk_code,win32api.MapVirtualKeyA(vk_code,win32con.MAPVK_VK_TO_VSC),KEYEVENTF_KEYUP)

还有很多鼠标键盘操作的api可以参考
https://docs.microsoft.com/en-us/windows/win32/api/_inputdev/

上一篇下一篇

猜你喜欢

热点阅读