2013-04-03 123 views
2

我的應用程序使用win32api.mouse_event向我的控制檯窗口外部的屏幕區域發送鼠標點擊。這導致我的窗口失去焦點,所以我無法檢測到按鍵使用msvcrt.kbhit.如何在控制檯窗口失去焦點時檢測按鍵

我的問題是,如何實現這樣的控制檯窗口不可見/活動?

編輯:

下面是示例代碼。這只是一個基本的控制檯版本。如果控制檯消失,請將其設置爲保持最高。一旦它在控制檯之外點擊(100,100),按Esc鍵不會脫離循環。如何實現像這樣的問題的休息?

import msvcrt, win32api, win32con 

pixelx = 100 
pixely = 100 

win32api.SetCursorPos((pixelx,pixely)) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,pixelx,pixely,0,0) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,pixelx,pixely,0,0) 

while 1: 
    print 'Testing..' 
    # body of the loop ... 
    if msvcrt.kbhit(): 
     if ord(msvcrt.getch()) == 27: 
      break 
+0

顯示您的代碼。沒有看到它,我們無法猜測它有什麼問題。 –

+0

我們走了,對不起:/ – user2122589

回答

4

我可以看到3種可能的方式。首先,將鼠標點擊後將您的窗口頂部,但我認爲這不是你想要發生的事情。

第二種方式,如果你想要的只是ESC鍵,它應該可以正常工作,那就是使用熱鍵。

import win32con, ctypes, ctypes.wintypes 

def esc_pressed(): 
    print("Escape was pressed.") 

ctypes.windll.user32.RegisterHotKey(None, 1, 0, win32con.VK_ESCAPE) 

try: 
    msg = ctypes.wintypes.MSG() 
    while ctypes.windll.user32.GetMessageA(ctypes.byref(msg), None, 0, 0) != 0: 
     if msg.message == win32con.WM_HOTKEY: 
      esc_pressed() 
     ctypes.windll.user32.TranslateMessage(ctypes.byref(msg)) 
     ctypes.windll.user32.DispatchMessageA(ctypes.byref(msg)) 
finally: 
    ctypes.windll.user32.UnregisterHotKey(None, 1) 

有關注冊與Python一個熱鍵,你可以看看here的詳細信息:這可以通過使用一個類似的方法來實現。

第三種方法,如果您想要捕捉每個按鍵,您將不得不使用的方法是設置低級別鍵盤鉤子。