How can I send keyboard commands (hold,release,simultanous) with a python script?

后端 未结 2 1039
北荒
北荒 2020-12-15 02:00

I want to send virtually the command like this:

when keypress==\"a\"                   #if entered key is \"a\"
    send {ALT+TAB}                   # send A         


        
2条回答
  •  南方客
    南方客 (楼主)
    2020-12-15 02:16

    I know how to do it with ctypes. For example for Alt-Tab (it is a lot of boilerplate code, I know) :

    import ctypes
    import time
    
    SendInput = ctypes.windll.user32.SendInput
    
    PUL = ctypes.POINTER(ctypes.c_ulong)
    class KeyBdInput(ctypes.Structure):
        _fields_ = [("wVk", ctypes.c_ushort),
                    ("wScan", ctypes.c_ushort),
                    ("dwFlags", ctypes.c_ulong),
                    ("time", ctypes.c_ulong),
                    ("dwExtraInfo", PUL)]
    
    class HardwareInput(ctypes.Structure):
        _fields_ = [("uMsg", ctypes.c_ulong),
                    ("wParamL", ctypes.c_short),
                    ("wParamH", ctypes.c_ushort)]
    
    class MouseInput(ctypes.Structure):
        _fields_ = [("dx", ctypes.c_long),
                    ("dy", ctypes.c_long),
                    ("mouseData", ctypes.c_ulong),
                    ("dwFlags", ctypes.c_ulong),
                    ("time",ctypes.c_ulong),
                    ("dwExtraInfo", PUL)]
    
    class Input_I(ctypes.Union):
        _fields_ = [("ki", KeyBdInput),
                     ("mi", MouseInput),
                     ("hi", HardwareInput)]
    
    class Input(ctypes.Structure):
        _fields_ = [("type", ctypes.c_ulong),
                    ("ii", Input_I)]
    
    def PressKey(hexKeyCode):
    
        extra = ctypes.c_ulong(0)
        ii_ = Input_I()
        ii_.ki = KeyBdInput( hexKeyCode, 0x48, 0, 0, ctypes.pointer(extra) )
        x = Input( ctypes.c_ulong(1), ii_ )
        ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
    
    def ReleaseKey(hexKeyCode):
    
        extra = ctypes.c_ulong(0)
        ii_ = Input_I()
        ii_.ki = KeyBdInput( hexKeyCode, 0x48, 0x0002, 0, ctypes.pointer(extra) )
        x = Input( ctypes.c_ulong(1), ii_ )
        ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
    
    
    def PressAltTab():
    
        PressKey(0x012) #Alt
        PressKey(0x09) #Tab
    
        time.sleep(2) #optional : if you want to see the atl-tab overlay
    
        ReleaseKey(0x09) #~Tab
        ReleaseKey(0x012) #~Alt
    
    
    if __name__ =="__main__":
    
         PressAltTab()
    

    A modern version would use Unicode :

    KEYEVENTF_UNICODE = 0x0004 KEYEVENTF_KEYUP = 0x0002

    def PressKey(KeyUnicode):
    
        extra = ctypes.c_ulong(0)
        ii_ = Input_I()
        ii_.ki = KeyBdInput( 0, KeyUnicode, KEYEVENTF_UNICODE, 0, ctypes.pointer(extra) )
        x = Input( ctypes.c_ulong(1), ii_ )
        ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
    
    def ReleaseKey(KeyUnicode):
    
        extra = ctypes.c_ulong(0)
        ii_ = Input_I()
        ii_.ki = KeyBdInput( 0, KeyUnicode, KEYEVENTF_UNICODE|KEYEVENTF_KEYUP, 0, ctypes.pointer(extra) )
        x = Input( ctypes.c_ulong(1), ii_ )
        ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
    
    
    def PressAltTab():
    
        PressKey(unichr(0x12)) #Alt
        PressKey(unichr(0x09)) #Tab
    
        time.sleep(2) #optional : if you want to see the atl-tab overlay
    
        ReleaseKey(unichr(0x09)) #~Tab
        ReleaseKey(unichr(0x12)) #~Alt
    
    
    if __name__ =="__main__":
    
         PressAltTab()
    

提交回复
热议问题