我在这个网站的某个地方使用这个 gem。
import ctypes
import pynput
SendInput = ctypes.windll.user32.SendInput
W = 0x11
A = 0x1E
S = 0x1F
D = 0x20
# 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)]
# Actuals Functions
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))
# directx scan codes http://www.gamespp.com/directx/directInputKeyboardScanCodes.html
# ganna need to rework pynput for this to work
import time
def asdf():
while True:
PressKey(0x11)
time.sleep(1)
ReleaseKey(0x11)
time.sleep(1)
asdf()
但是只要导入 pynput,就会返回这个错误。
ctypes.ArgumentError:参数 2::预期 LP_INPUT 实例而不是 LP_Input
这个小 ctypes 脚本确实可以独立工作,但我真的想尝试将这些机制合并到我的程序的其余部分中。我不想废弃我的代码的 pynput 部分。它变得相当大。
有什么方法可以阻止他们尝试相互合作吗?因为我认为这是因为 pynput 更像是一个包装器,并且在某种程度上增加了它提取的数据。具体不太清楚,还在学习中。
我需要 ctypes 的原因是因为它是我发现的唯一输出直接输入的解决方案。(适用于游戏和任何使用 directx 的东西。)对不起,如果这没有足够的信息或者我以丑陋的方式发布了这个。我愿意通过建议来解决这个问题。
更新:
去学习 C.
这是其余的错误。
回溯(最近一次通话):文件“C:/Users/bbdan/PycharmProjects/Playground/directkeys.py”,第 72 行,在 asdf() 文件“C:/Users/bbdan/PycharmProjects/Playground/directkeys.py”中, 第 67 行, asdf PressKey(0x11) 文件 "C:/Users/bbdan/PycharmProjects/Playground/directkeys.py", 第 50 行, 在 PressKey ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x)) ctypes.ArgumentError: 参数 2: : 预期的 LP_INPUT 实例而不是 LP_Input