我试图从user32.dll获取SendInput函数,以便使用ctypes在python中工作。我是一个noob,但从我从文档中读取的内容来看,您必须在python中创建函数所需的结构,然后将其传递给函数
import ctypes
import keyboard
from ctypes import *
lib = windll.user32
KEYEVENTF_SCANCODE = 0x8
KEYEVENTF_KEYUP = 0x2
SPACEBAR = 57 # 0x39
INPUT_KEYBOARD = 1
class KEYBDINPUT(Structure):
_fields_ = [('wVk' , c_ushort) , ('wScan' , c_ushort)
, ('dwFlags' , c_ulong) , ('time' , c_ulong) , ('dwExtraInfo' , c_ulong)]
class INPUT(Structure):
_fields_ = [('type' , c_ulong) ,('ki' , KEYBDINPUT)]
lib.SendInput.restype = c_uint
lib.SendInput.argtypes = [c_uint , INPUT , c_int]
keybdinput_obj = KEYBDINPUT(0 , SPACEBAR , KEYEVENTF_SCANCODE , 0 , 0)
input_obj = INPUT(INPUT_KEYBOARD , keybdinput_obj)
keyboard.wait('u')
lib.SendInput(1 , byref(input_obj) , sizeof(INPUT))
keybdinput_obj = KEYBDINPUT(0 , SPACEBAR , KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP , 0 , 0)
input_obj = INPUT(INPUT_KEYBOARD , keybdinput_obj)
lib.SendInput(1 , byref(input_obj) , sizeof(INPUT))
在我从输入结构引导自己的microsoft文档中,有一个union,但我想如果我只需要KEYBDINPUT,那么它与我有一个union是一样的
https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-input
https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-keybdinput
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput
我几乎被卡住了,因为我看不出这里出了什么问题,所以我请求帮助。程序应该在我按下键盘上的“u”后发送一个空格(这是为了调试),我这样做是因为我希望它以扫描码而不是虚拟按键的形式发送
因此,如果python中有另一种方法可以用来发送扫描代码,那就行了,我将非常感谢
定义整个联合体,或者至少定义鼠标输入,它是联合体的最大成员。您可以通过打印测试定义的大小是否正确(sizeof(INPUT)),并且它应该与在C程序中打印输入结构的大小一致。对于32位C结构,我得到了28码,对于64位C结构,得到了40码
另外,SendInput的第二个参数是指针(INPUT),而不是INPUT,而ULONG_PTR不一定是
c_ulong
,因为它依赖于运行32位或64位Python下面是一个经过测试的示例:
运行64位Python 3.6的终端上的输出:
相关问题 更多 >
编程相关推荐