|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 wei_Y 于 2016-11-13 13:22 编辑
注: 此文只适合Windows平台。
0. 安装pywin32环境。
pip install pywin32
比较推荐 使用pyinstaller,
pyinstaller是将python程序打包为exe的python包。
pyinstaller依赖pywin32, 安装pyinstaller 会自动检测是否有安装pywin32,如果没有则会直接安装。
1. 使用按键模拟。
网上已经有太多使用pywin32的按键模拟教程了。
关于win32的函数与消息类型请直接查看。
http://bbs.fishc.com/thread-64179-1-1.html
http://bbs.fishc.com/thread-47244-1-1.html
或者pywin32带的pywin32文档。
简单总结:
- 使用PostMessage发送消息。
- 0x0102: 按下某键,当 TranslateMessage 转发 WM_KEYDOWN 后发送本消息
- ord('c'),使用的是该字符的ascii来输入。
- win32gui.PostMessage(handle, 0x0102, ord('c'), None)
复制代码
- 使用SendMessage发送消息。
- win32gui.SendMessage(handle, 0x0102, ord('c'), None)
- 与PostMessage基本一致,区别是SendMessage有一个返回值。
复制代码
- 使用keybd_event模拟按键。
- 第一个值为该键的 虚拟码,第二个为扫描码,后面俩填0就行了。
- win32api.keybd_event(VK_CODE['shift'], win32api.MapVirtualKey(VK_CODE['shift'], 0), 0, 0)
- 因为是模拟按键,不要忘记将该键抬起。
- win32api.keybd_event(VK_CODE['shift'], win32api.MapVirtualKey(VK_CODE['shift'], 0), win32con.KEYEVENTF_KEYUP, 0)
复制代码
使用SendInput模拟按键。
不太懂,在stackoverflow上找到的。
- SendInput = ctypes.windll.user32.SendInput
- # C struct redefinitions
- PUL = ctypes.POINTER(ctypes.c_ulong)
- class KeyBdInput(ctypes.Structure):
- _fields_ = [("wVk", ctypes.c_ushort),
- ("wScan", ctypes.c_ushort),
- ("dwFlags", ctypes.c_ulong),
- ("time", ctypes.c_ulong),
- ("dwExtraInfo", PUL)]
- class HardwareInput(ctypes.Structure):
- _fields_ = [("uMsg", ctypes.c_ulong),
- ("wParamL", ctypes.c_short),
- ("wParamH", ctypes.c_ushort)]
- class MouseInput(ctypes.Structure):
- _fields_ = [("dx", ctypes.c_long),
- ("dy", ctypes.c_long),
- ("mouseData", ctypes.c_ulong),
- ("dwFlags", ctypes.c_ulong),
- ("time",ctypes.c_ulong),
- ("dwExtraInfo", PUL)]
- class Input_I(ctypes.Union):
- _fields_ = [("ki", KeyBdInput),
- ("mi", MouseInput),
- ("hi", HardwareInput)]
- class Input(ctypes.Structure):
- _fields_ = [("type", ctypes.c_ulong),
- ("ii", Input_I)]
- def PressKey(hexKeyCode):
- extra = ctypes.c_ulong(0)
- ii_ = Input_I()
- ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008, 0, ctypes.pointer(extra) )
- x = Input( ctypes.c_ulong(1), ii_ )
- ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
- def ReleaseKey(hexKeyCode):
- extra = ctypes.c_ulong(0)
- ii_ = Input_I()
- ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008 | 0x0002, 0, ctypes.pointer(extra) )
- x = Input( ctypes.c_ulong(1), ii_ )
- ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
复制代码
使用上面这些能应对大部分的情况了,
但是有一些情况,把这些事件过滤掉的话,那些程序都不能响应你发出的按键。
比如TGP——腾讯游戏平台,不管用哪种方法,都无法在它的密码框里输入正确的信息。
想要进行按键模拟,只能从更加底层的方法入手——直接相当于按键盘的那种。
网上有介绍winio的资料,但是不多,也不知道python要怎么调用这只库。。
无奈,pypi里也没有库可用。
穷途末路之际,发现某大神写的驱动级模拟按键的程序——DD虚拟键盘。
这里是度盘。
链接:http://pan.baidu.com/s/1jIe6DU2
DD虚拟键盘提供一对可编程的虚拟键盘及鼠标,这里是帮助文档。
虽然帮助文档里没有说python,但是不妨碍我们使用它,
它提供dll文件,我们可以用ctype.windll.LoadLibrary来加载。
那么32位的python就调用32位,64位的就调用64位的。
那么我们只需要用
DD_key(x, 1)
DD_key(x, 2)
就可以模拟输入了。
- dd_dll = windll.LoadLibrary(os.getcwd()+r'ddx64.dll')
- dd_dll.DD_key(313, 1)
- dd_dll.DD_key(313, 2)
复制代码
就会发现按了一次回车。
将DD的虚拟码表一一对应,就也可以在一些过滤了windows本身事件的程序里成功模拟按键了~。
有个不太好的地方就是——需要联网使用。 |
评分
-
参与人数 1 | 荣誉 +30 |
鱼币 +20 |
贡献 +10 |
收起
理由
|
小甲鱼
| + 30 |
+ 20 |
+ 10 |
好东西啊! |
查看全部评分
本帖被以下淘专辑推荐:
- · 收藏,必用!|主题: 413, 订阅: 102
- · 百淘|主题: 11, 订阅: 0
|