在Python编程中, 有时需要模拟键盘或鼠标事件, 自动操作计算机, 比如玩游戏等。
本文介绍使用ctypes模块调用API函数, 模拟键盘鼠标事件的方法。

目录

  • 1.导入ctypes模块
  • 2.通过ctypes.windll调用api函数
  • 3.模拟键盘事件
  • 4.模拟鼠标事件

1.导入ctypes模块

ctypes 是 Python 的外部函数库,提供了与 C 兼容的数据类型,并且支持直接调用 DLL 中的函数 (这对于调用API函数非常有用)。

from ctypes import *

2.通过ctypes.windll调用api函数

可通过操作dll对象的属性来操作这些函数。如:

windll.user32.keybd_event(32,0,0,0) # 按下空格键

有时需要传递数据类型给函数 :

class PointAPI(Structure):#PointAPI类型,用于获取鼠标坐标_fields_ = [("x", c_ulong), ("y", c_ulong)]
def getpos():"获取当前鼠标位置。"po = PointAPI()windll.user32.GetCursorPos(byref(po)) # 传递数据类型的引用return int(po.x), int(po.y)

3.模拟键盘事件

模拟键盘事件主要用到了keybd_event() API函数, 用于在活动窗口生成一个键盘事件。
完整源代码见: qfcy_ / Python · GitCode

KEYEVENTF_KEYUP=2
VK_CODE = { # 定义按键代码
'backspace':0x08,
'tab':0x09,
'clear':0x0C,
'enter':0x0D,
'shift':0x10,
'ctrl':0x11,
'alt':0x12,
'pause':0x13,
'caps_lock':0x14,
'esc':0x1B,
'space':0x20,
'page_up':0x21,'pgup':0x21,
'page_down':0x22,'pgdn':0x22,
'end':0x23,
'home':0x24,
'left':0x25,
'up':0x26,
'right':0x27,
'down':0x28,
'+':0xBB,
',':0xBC,
'-':0xBD,
'.':0xBE,
'/':0xBF,
'`':0xC0,
';':0xBA,
'[':0xDB,
'\\':0xDC,
']':0xDD,
"'":0xDE,
'`':0xC0}
VK_CODE.update(dict([("f%d"%i,0x6F+i) for i in range(1,13)])
)
VK_CODE.update(dict([("numpad_%d"%i,0x60+i) for i in range(10)])
)
keybd_event=windll.user32.keybd_eventdef __convert(keycode_or_keyname):#识别参数格式, 将按键名称转换为键码值if type(keycode_or_keyname) is str:keyname=keycode_or_keyname.lower().replace(' ','_')if keyname in VK_CODE:return VK_CODE[keyname]else:if not len(keycode_or_keyname)==1:raise ValueError("{} is not a correct key name".format(keycode_or_keyname))return ord(keycode_or_keyname.upper())else:return keycode_or_keynamedef keydown(keycode_or_keyname):"""模拟键按下。
keycode_or_keyname:按键名称或该按键的键码值"""keycode=__convert(keycode_or_keyname)keybd_event(keycode,0,0,0)def keyup(keycode_or_keyname):"""模拟键释放。
keycode_or_keyname:按键名称或该按键的键码值"""keycode=__convert(keycode_or_keyname)keybd_event(keycode,0,KEYEVENTF_KEYUP,0)def keypress(keycode_or_keyname,delay=0.05):"""模拟按键。
keycode_or_keyname:按键名称或该按键的键码值
delay:键按下与释放之间的的间隔时间,间隔时间越小,按键速度越快。"""keycode=__convert(keycode_or_keyname)keydown(keycode)time.sleep(delay)keyup(keycode)time.sleep(delay)

4.模拟鼠标事件

GetCursorPos(): 获得鼠标坐标。
SetCursorPos(): 设置鼠标坐标, 即移动鼠标。
mouse_event(): 在当前光标位置生成一个鼠标事件, 如鼠标按下、释放。

#API常量
MOUSEEVENTF_LEFTDOWN = 0x2
MOUSEEVENTF_LEFTUP = 0x4
MOUSEEVENTF_MIDDLEDOWN = 0x20
MOUSEEVENTF_MIDDLEUP = 0x40
MOUSEEVENTF_RIGHTDOWN = 0x8
MOUSEEVENTF_RIGHTUP = 0x10
MOUSEEVENTF_MOVE = 0x1user32=windll.user32class PointAPI(Structure):#PointAPI类型,用于获取鼠标坐标_fields_ = [("x", c_ulong), ("y", c_ulong)]def get_screensize():"获取当前屏幕分辨率。"GetSystemMetrics = user32.GetSystemMetricsreturn GetSystemMetrics(0), GetSystemMetrics(1)def getpos():"""获取当前鼠标位置。
返回值为一个元组,以(x,y)形式表示。"""po = PointAPI()user32.GetCursorPos(byref(po))return int(po.x), int(po.y)def goto(x,y):"将鼠标移动至指定位置(x,y)。"user32.SetCursorPos(x,y)
setpos=gotodef move(x,y):"""模拟移动鼠标。
与goto不同,move()*产生*一个鼠标事件。"""goto(x,y)try:user32.mouse_event(MOUSEEVENTF_MOVE,x,y)# 忽略可能的ValueError: Procedure probably called with not enough arguments (16 bytes missing)except ValueError as err:warn("ValueError: "+str(err))def click(delay=0):"模拟鼠标左键单击"try:user32.mouse_event(MOUSEEVENTF_LEFTDOWN)except ValueError as err: # 同上warn("ValueError: "+str(err))time.sleep(delay)try:user32.mouse_event(MOUSEEVENTF_LEFTUP)except ValueError as err:warn("ValueError: "+str(err))def right_click(delay=0):"模拟鼠标右键单击"try:user32.mouse_event(MOUSEEVENTF_RIGHTDOWN)except ValueError as err:warn("ValueError: "+str(err))time.sleep(delay)try:user32.mouse_event(MOUSEEVENTF_RIGHTUP)except ValueError as err:warn("ValueError: "+str(err))def dblclick(delay=0.25):"模拟鼠标左键双击"click()time.sleep(delay)click()def middle_click(delay=0):"模拟单击鼠标中键"try:user32.mouse_event(MOUSEEVENTF_MIDDLEDOWN)except ValueError as err:warn("ValueError: "+str(err))time.sleep(delay)try:user32.mouse_event(MOUSEEVENTF_MIDDLEUP)except ValueError as err:warn("ValueError: "+str(err))

延伸阅读:Python ctypes模块调用API函数, 制作控制电脑其他窗口工具

Python ctypes 调用API函数模拟键盘鼠标事件相关推荐

  1. [转载]C#模拟键盘鼠标事件-SendKeys

    C#模拟键盘鼠标事件-SendKeys 2007-09-18 15:138596人阅读评论(1)收藏举报 1.模拟键盘事件 System.Windows.Forms.SendKeys以下是   Sen ...

  2. 模拟键盘鼠标事件有两种方法

    实现一个鼠标或者键盘模拟器,可以完成很多功能,比如做一个简单的游戏外挂^_^.通常,模拟键盘鼠标事件有两种方法: 1.keybd_event, mouse_event 2.SendMessage, P ...

  3. windows模拟键盘鼠标事件DirectX游戏中

    有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘 ...

  4. Android查询:模拟键盘鼠标事件(adb shell 实现)

    1. 发送键盘事件: 命令格式1:adb shell input keyevent "value" 其中value以及对应的key code如下表所列: KeyEvent Valu ...

  5. Python 模拟键盘鼠标操作实战教程

    在某些情况下,如果我们需要进行自动化操作的应用没有提供相应的接口,我们无法直接通过Python来调用API实现自动化.这种情况下,Python也不是完全没有办法的,我们可以采用模拟键盘和鼠标的方式实现 ...

  6. win32键盘输入python_windows下python捕捉键盘鼠标事件 pywin32 | 学步园

    最近学习python中, 需要调用gui的wincom组件,网上搜罗了很多相关资料.但是大部分资料都有问题.也许跟python的开源和版本问题有关. 下面我就把网上罗列出来最多的捕捉键盘鼠标事件的代码 ...

  7. 程序模拟键盘鼠标操作

    用代码模拟键盘鼠标操作,主要用到keybd_event/mouse_event或者SendInput  API函数.使用示例如下(附注释):         /*         * 模拟键盘输入,以 ...

  8. python中调用C++函数

    python中调用C++函数 无参调用 单变量传入与返回调用 numpy数组传入与返回调用 c++类调用 用python写不香吗?还这么复杂调用C++? 一. 无参调用 在python中调用无参数和无 ...

  9. 在python里调用C函数的三种方式

    一个python项目快速开发完以后,常常针对瓶颈进行优化,其中一种方式就是对于性能至关重要的部分,使用C重写,这已经是一种最佳实践.如果整个项目完全使用C,开发效率就没有保障.python运行环境(C ...

最新文章

  1. 「模型解读」深度学习网络只能有一个输入吗
  2. C#DataGrdviewl加入checkBox全选删除
  3. [转载]玩转Asp.net MVC 的八个扩展点
  4. xmake 新增对 Qt 编译环境支持,用自己最喜爱的编辑器去开发 Qt 程序
  5. 长路漫漫,唯剑作伴--loadView、viewDidLoad及viewDidUnload的关系
  6. java 蓝桥杯算法提高 成绩排序2
  7. 在eclipse中利用条件断点打印log
  8. 【Elasticsearch】Elasticsearch的数据类型 (text、keyword、date、object、geo等)
  9. 【luogu】P1772物流运输(最短路+DP)
  10. 拓端tecdat|R语言Bootstrap的岭回归和自适应LASSO回归可视化
  11. 怎么给服务器部署php探针,phpStudy学习之php探针
  12. AR8035芯片手册 解析|CSDN创作打卡
  13. 陀螺仪和加速度传感器
  14. App 启动时如何知道 CloudKit 的 iCloud 数据同步操作已经结束了?
  15. 8583 mac 字符选择 java 实现_8583报文MAC验证实现过程
  16. Xubuntu Linux发行版放弃即时消息软件Pidgin
  17. Java方法 的学习
  18. mysql binlog定点恢复锁表_MySQL -- binlog 操作与恢复
  19. 【独立游戏】Sunset——二次元横版动作游戏
  20. 2022mathorcup数学建模大数据竞赛B题完整成品来啦!

热门文章

  1. Linux与TPM2芯片
  2. Python实现自定义竖线的线型
  3. linux下Dnw配置(mini2440)
  4. Revit建模插件:REVIT MEP 管道拐弯坡度画法及管道弯头半径显示
  5. 盛世昊通解析什么是汽车OTA技术,智能汽车新颠覆
  6. cdrom是什么意思_电脑按f8一键出现cdrom:ps-ASUS DVD-e818a4是什么意思
  7. linux下故障硬盘点灯操作
  8. Reactive 简介
  9. 会声会影X5捕获视频失败
  10. c# char unsigned_关于C ++:将unsigned char *复制到unsigned char *