如何在Python中生成键盘事件?

如何在Python中生成键盘事件?,第1张

如何在Python中生成键盘事件?

可以使用ctypes完成:

import ctypesfrom ctypes import wintypesimport timeuser32 = ctypes.WinDLL('user32', use_last_error=True)INPUT_MOUSE    = 0INPUT_KEYBOARD = 1INPUT_HARDWARE = 2KEYEVENTF_EXTENDEDKEY = 0x0001KEYEVENTF_KEYUP       = 0x0002KEYEVENTF_UNICODE     = 0x0004KEYEVENTF_SCANCODE    = 0x0008MAPVK_VK_TO_VSC = 0# msdn.microsoft.com/en-us/library/dd375731VK_TAB  = 0x09VK_MENU = 0x12# C struct definitionswintypes.ULONG_PTR = wintypes.WPARAMclass MOUSEINPUT(ctypes.Structure):    _fields_ = (("dx",          wintypes.LONG),     ("dy",          wintypes.LONG),     ("mouseData",   wintypes.DWORD),     ("dwFlags",     wintypes.DWORD),     ("time",        wintypes.DWORD),     ("dwExtraInfo", wintypes.ULONG_PTR))class KEYBDINPUT(ctypes.Structure):    _fields_ = (("wVk",         wintypes.WORD),     ("wScan",       wintypes.WORD),     ("dwFlags",     wintypes.DWORD),     ("time",        wintypes.DWORD),     ("dwExtraInfo", wintypes.ULONG_PTR))    def __init__(self, *args, **kwds):        super(KEYBDINPUT, self).__init__(*args, **kwds)        # some programs use the scan pre even if KEYEVENTF_SCANCODE        # isn't set in dwFflags, so attempt to map the correct pre.        if not self.dwFlags & KEYEVENTF_UNICODE: self.wScan = user32.MapVirtualKeyExW(self.wVk,     MAPVK_VK_TO_VSC, 0)class HARDWAREINPUT(ctypes.Structure):    _fields_ = (("uMsg",    wintypes.DWORD),     ("wParamL", wintypes.WORD),     ("wParamH", wintypes.WORD))class INPUT(ctypes.Structure):    class _INPUT(ctypes.Union):        _fields_ = (("ki", KEYBDINPUT),         ("mi", MOUSEINPUT),         ("hi", HARDWAREINPUT))    _anonymous_ = ("_input",)    _fields_ = (("type",   wintypes.DWORD),     ("_input", _INPUT))LPINPUT = ctypes.POINTER(INPUT)def _check_count(result, func, args):    if result == 0:        raise ctypes.WinError(ctypes.get_last_error())    return argsuser32.SendInput.errcheck = _check_countuser32.SendInput.argtypes = (wintypes.UINT, # nInputs       LPINPUT,       # pInputs       ctypes.c_int)  # cbSize# Functionsdef PressKey(hexKeyCode):    x = INPUT(type=INPUT_KEYBOARD,   ki=KEYBDINPUT(wVk=hexKeyCode))    user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))def ReleaseKey(hexKeyCode):    x = INPUT(type=INPUT_KEYBOARD,   ki=KEYBDINPUT(wVk=hexKeyCode,      dwFlags=KEYEVENTF_KEYUP))    user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))def AltTab():    """Press Alt+Tab and hold Alt key for 2 seconds    in order to see the overlay.    """    PressKey(VK_MENU)   # Alt    PressKey(VK_TAB)    # Tab    ReleaseKey(VK_TAB)  # Tab~    time.sleep(2)    ReleaseKey(VK_MENU) # Alt~if __name__ == "__main__":    AltTab()

hexKeyCode是Windows API定义的虚拟键盘映射。代码列表在MSDN上可用:虚拟键代码(Windows)



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5640925.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存