2012-11-08 29 views
4

我想幾乎發送命令是這樣的:如何使用python腳本發送鍵盤命令(保持,釋放,同時)?

when keypress=="a"     #if entered key is "a" 
    send {ALT+TAB}     # send ALT and TAB simultaneously 
    sleep(2)       #wait for 2 sec 
    send {"I love my Country",0.1} #send all strings at 0.1 sec wait 
    key_down("BACKSPACE",1)   #hold down backspace key for 1 sec 
    send{ALT+F4}      #send ALT and F4 simultaneously 

對於所有的或特定的應用程序,也OpenGL遊戲也是如此。

我試圖SendKeys.py但沒有同時輸入功能和用於發送按住的鍵指令沒有key_down的方法。所有的意見將不勝感激。

+0

[Here](http://stackoverflow.com/a/35373648/2924421)是適用於OS X – Phylliida

回答

8

我知道如何與ctypes的做到這一點。例如,對於使用Alt-Tab(這是很多樣板代碼,我知道):

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() 

現代版本將使用Unicode:

KEYEVENTF_UNICODE = 0x0004 KEYEVENTF_KEYUP = 0×0002

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() 
+0

的解決方案。謝謝你這是非常有用的,但PressKey似乎在Windows 8上測試時會自動發佈。任何想法爲什麼會發生這種情況? – Phito

+0

爲什麼你使用'0x48'作爲每個按鍵的掃描碼?它不應該和你正在使用的'hexKeyCode'有相同的值嗎? –

+0

你是完全正確的:我寫了「傳統」ANSI風格的按鍵。現代版本應該使用Unicode。 – lucasg

相關問題