【发布时间】:2020-06-04 08:21:06
【问题描述】:
我正在尝试使用 ctypes 从 user32.dll 获取 SendInput 函数以在 python 中工作。我是一个菜鸟,但从我从文档中读到的内容中,您必须在 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))
在我从 INPUT 结构引导自己的微软文档中有一个联合,但我想如果我只需要 KEYBDINPUT 那么它就像我有一个联合一样。
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 中有另一种方式可以发送扫描码,那将是可行的,我将不胜感激。
【问题讨论】:
-
您可以使用 PyWin32 或 PyInput 模块。