【问题标题】:Is it possible to use win32 in python 3.8 for pressing keys on your keyboard是否可以在 python 3.8 中使用 win32 来按下键盘上的键
【发布时间】:2020-06-20 10:27:37
【问题描述】:

我创建了一个应用程序,它使用 pydirectinput 在键盘上按下一些键。问题是 pydirectinput 有点慢,我的应用程序需要快速。有谁知道如何使用win32进行按键操作,如果是的话,你能告诉我如何下载和安装它,以及如何使用它来按下键盘上的一些键。我正在使用python 3.8。谢谢

【问题讨论】:

    标签: python winapi pywin32 win32com win32gui


    【解决方案1】:

    在win32下,可以使用SendInput模拟键盘输入。

    在python中,可以导入ctypes库调用SendInput

    代码示例:

    import ctypes
    from ctypes import wintypes
    import time
    
    user32 = ctypes.WinDLL('user32', use_last_error=True)
    
    INPUT_MOUSE    = 0
    INPUT_KEYBOARD = 1
    INPUT_HARDWARE = 2
    
    KEYEVENTF_EXTENDEDKEY = 0x0001
    KEYEVENTF_KEYUP       = 0x0002
    KEYEVENTF_UNICODE     = 0x0004
    KEYEVENTF_SCANCODE    = 0x0008
    
    MAPVK_VK_TO_VSC = 0
    
    # msdn.microsoft.com/en-us/library/dd375731
    VK_TAB  = 0x09
    VK_MENU = 0x12
    
    # C struct definitions
    
    wintypes.ULONG_PTR = wintypes.WPARAM
    
    class 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 code even if KEYEVENTF_SCANCODE
            # isn't set in dwFflags, so attempt to map the correct code.
            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 args
    
    user32.SendInput.errcheck = _check_count
    user32.SendInput.argtypes = (wintypes.UINT, # nInputs
                                 LPINPUT,       # pInputs
                                 ctypes.c_int)  # cbSize
    
    # Functions
    
    def 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() 
    

    这是@lucasg提供的示例。

    【讨论】:

    • @PeanutInANutshell 嗨,如果答案有帮助,您可以随时accept 它。
    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2022-10-25
    相关资源
    最近更新 更多