栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在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)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/635054.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号