实践证明 pyinput会被游戏屏蔽
winio只适合PS/2 圆口键盘
下面使用
参考:https://mp.weixin.qq.com/s/WXf5JVyyFZqp-DYlGigL-g
win32api:
准备:安装好pywin32,pip insatall pywin32
然后使用时
import win32api
import win32con #导入这两个模块
import time #导入时间模块要有中断时间
import ctypes
def keydownup(num):
MapVirtualKey = ctypes.windll.user32.MapVirtualKeyA
time.sleep(0.4)
win32api.keybd_event(num, MapVirtualKey(num, 0), 0, 0)
time.sleep(0.2)
win32api.keybd_event(num, MapVirtualKey(num, 0), win32con.KEYEVENTF_KEYUP, 0)
其中MapVirtualkey是扫描码,一般不使用这个,如果要制作控制游戏人物的脚本时一定要填入扫描码才能在游戏中实现硬件级键盘模拟。
方法很简单
win32api.keybd_event(虚拟码,扫描码,0,0)
第一个参数是虚拟码有一些是不太一样的,需要自己根据自己的电脑测出相关的虚拟码,其中一些虚拟码,
left_arrow = 0x61
up_arrow = 0x65
right_arrow = 0x63
down_arrow = 0x62
a = 0x41
d = 0x44
x = 0x58
第二个参数是扫描码,如果一个一个去寻找扫描码会很麻烦,可以像我那样,在方法开始处或者程序起始处添加这么一句
MapVirtualKey = ctypes.windll.user32.MapVirtualKeyA
然后就可以传入虚拟码来寻找相应的扫描码
第三个是参数是作为判断按下与抬起的标识,按下时为0即可,因为键盘的全过程是按下与抬起,所有两个keybd_event才是一个完整的过程,其中一定要给其中添加一个时间暂停的,不然还是无法使用,即使在操作台或者pycharm上可以输入,在游戏中便没有效果了,时间自己可以传参数进去,也可以规定一个固定的值,这个时间便是你按住的时间
第四个参数直接为0即可
最重要的一点,如果要在游戏中使用,一定要以管理员的权限运行脚本,这样才可以使用。
参考自:https://blog.csdn.net/qq_33371343/article/details/78916751
一、pywin32常用函数
(1)获取鼠标位置
win32api.GetCursorPos()
(2)鼠标左键按下
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
(3)鼠标左键放开
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
(4)鼠标右键按下
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
(5)鼠标右键放开
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
(6)设置鼠标位置
win32api.SetCursorPos((x, y))
(7)键盘输入事件
win32api.keybd_event(VK_CODE[word], 0, 0, 0)
win32api.keybd_event(VK_CODE[word], 0, win32con.KEYEVENTF_KEYUP, 0)
二、封装接口
(1)获取当前鼠标位置
def cursor_point(self):
"""
获取当前鼠标位置
"""
pos = win32api.GetCursorPos()
return int(pos[0]), int(pos[1])
(2)鼠标左击事件
def mouse_left_click(self, new_x=None, new_y=None, times=1):
"""
鼠标左击事件
:param new_x: 新移动的坐标x轴坐标
:param new_y: 新移动的坐标y轴坐标1506240215
:param times: 点击次数
"""
self.mouse_move(new_x, new_y)
time.sleep(0.05)
while times:
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
times -= 1
(3)鼠标右击事件
def mouse_right_click(self, new_x=None, new_y=None):
"""
鼠标右击事件
:param new_x: 新移动的坐标x轴坐标
:param new_y: 新移动的坐标y轴坐标
"""
self.mouse_move(new_x, new_y)
time.sleep(0.05)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
(4)移动鼠标位置
def mouse_move(self, new_x, new_y):
if new_y is not None and new_x is not None:
point = (new_x, new_y)
win32api.SetCursorPos(point)
self.x = new_x
self.y = new_y
(5)键盘输入文本
def key_input(self, input_words=''):
for word in input_words:
win32api.keybd_event(VK_CODE[word], 0, 0, 0)
win32api.keybd_event(VK_CODE[word], 0, win32con.KEYEVENTF_KEYUP, 0)
time.sleep(0.1)
(6)键盘输入事件
def key_even(self, input_key):
win32api.keybd_event(VK_CODE[input_key], 0, 0, 0)
win32api.keybd_event(VK_CODE[input_key], 0, win32con.KEYEVENTF_KEYUP, 0)
time.sleep(1)