鱼C论坛

 找回密码
 立即注册
查看: 19636|回复: 69

[作品展示] 【按键模拟】使用python进行驱动级按键模拟。

[复制链接]
发表于 2016-11-13 13:18:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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文档。


简单总结:


  1. 使用PostMessage发送消息。

  2. 0x0102: 按下某键,当 TranslateMessage 转发 WM_KEYDOWN 后发送本消息

  3. ord('c'),使用的是该字符的ascii来输入。

  4. win32gui.PostMessage(handle, 0x0102, ord('c'), None)
复制代码


  1. 使用SendMessage发送消息。
  2. win32gui.SendMessage(handle, 0x0102, ord('c'), None)

  3. 与PostMessage基本一致,区别是SendMessage有一个返回值。
复制代码


  1. 使用keybd_event模拟按键。

  2. 第一个值为该键的 虚拟码,第二个为扫描码,后面俩填0就行了。

  3. win32api.keybd_event(VK_CODE['shift'], win32api.MapVirtualKey(VK_CODE['shift'], 0), 0, 0)

  4. 因为是模拟按键,不要忘记将该键抬起。

  5. win32api.keybd_event(VK_CODE['shift'], win32api.MapVirtualKey(VK_CODE['shift'], 0), win32con.KEYEVENTF_KEYUP, 0)
复制代码



使用SendInput模拟按键。
不太懂,在stackoverflow上找到的。
  1. SendInput = ctypes.windll.user32.SendInput

  2. # C struct redefinitions
  3. PUL = ctypes.POINTER(ctypes.c_ulong)
  4. class KeyBdInput(ctypes.Structure):
  5.     _fields_ = [("wVk", ctypes.c_ushort),
  6.                 ("wScan", ctypes.c_ushort),
  7.                 ("dwFlags", ctypes.c_ulong),
  8.                 ("time", ctypes.c_ulong),
  9.                 ("dwExtraInfo", PUL)]

  10. class HardwareInput(ctypes.Structure):
  11.     _fields_ = [("uMsg", ctypes.c_ulong),
  12.                 ("wParamL", ctypes.c_short),
  13.                 ("wParamH", ctypes.c_ushort)]

  14. class MouseInput(ctypes.Structure):
  15.     _fields_ = [("dx", ctypes.c_long),
  16.                 ("dy", ctypes.c_long),
  17.                 ("mouseData", ctypes.c_ulong),
  18.                 ("dwFlags", ctypes.c_ulong),
  19.                 ("time",ctypes.c_ulong),
  20.                 ("dwExtraInfo", PUL)]

  21. class Input_I(ctypes.Union):
  22.     _fields_ = [("ki", KeyBdInput),
  23.                  ("mi", MouseInput),
  24.                  ("hi", HardwareInput)]

  25. class Input(ctypes.Structure):
  26.     _fields_ = [("type", ctypes.c_ulong),
  27.                 ("ii", Input_I)]

  28. def PressKey(hexKeyCode):
  29.     extra = ctypes.c_ulong(0)
  30.     ii_ = Input_I()
  31.     ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008, 0, ctypes.pointer(extra) )
  32.     x = Input( ctypes.c_ulong(1), ii_ )
  33.     ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

  34. def ReleaseKey(hexKeyCode):
  35.     extra = ctypes.c_ulong(0)
  36.     ii_ = Input_I()
  37.     ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008 | 0x0002, 0, ctypes.pointer(extra) )
  38.     x = Input( ctypes.c_ulong(1), ii_ )
  39.     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)
就可以模拟输入了。


  1. dd_dll = windll.LoadLibrary(os.getcwd()+r'ddx64.dll')
  2. dd_dll.DD_key(313, 1)
  3. dd_dll.DD_key(313, 2)
复制代码


就会发现按了一次回车。

将DD的虚拟码表一一对应,就也可以在一些过滤了windows本身事件的程序里成功模拟按键了~。
游客,如果您要查看本帖隐藏内容请回复

游客,如果您要查看本帖隐藏内容请回复


有个不太好的地方就是——需要联网使用。

评分

参与人数 1荣誉 +30 鱼币 +20 贡献 +10 收起 理由
小甲鱼 + 30 + 20 + 10 好东西啊!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-13 13:58:32 | 显示全部楼层
为什么 需要联网使用 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-13 14:22:17 | 显示全部楼层
SixPy 发表于 2016-11-13 13:58
为什么 需要联网使用 ?

因为是别人写的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-13 14:50:41 | 显示全部楼层
wei_Y 发表于 2016-11-13 14:22
因为是别人写的。。


这种有疑似后门的驱动,还是别用了吧~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-5 23:45:21 | 显示全部楼层
你终于研究出来了~_~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-6 11:45:18 | 显示全部楼层
小甲鱼 发表于 2016-12-5 23:45
你终于研究出来了~_~

别人写的,拿来用- -。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-20 11:14:43 From FishC Mobile | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-14 18:49:30 | 显示全部楼层
666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-15 23:29:52 | 显示全部楼层
7748574
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-18 10:16:05 | 显示全部楼层
6666666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-29 10:21:46 | 显示全部楼层
...........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-27 17:31:09 | 显示全部楼层
看一看 在使用python写游戏代码的时候 发现 win32api被屏蔽 难受  求救
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-4 15:44:23 | 显示全部楼层
么么哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-21 12:57:22 | 显示全部楼层
大神,回复看一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-22 22:04:01 | 显示全部楼层
我想看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-12 10:23:01 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-31 00:59:19 | 显示全部楼层
厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-31 01:09:39 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-31 17:50:25 | 显示全部楼层
大佬,请问一下,下载了这个DD模拟器后,用不用把他的dll,放到其他位置,或者怎么做,用不用注册,还有就是我调用的时候,用不了64的,一用就说不是有效的win32应用程序,用32位好像是可以的,但是还是出现错误,我的电脑和pycharm都是64位的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-26 08:24:14 | 显示全部楼层
11111111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 20:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表