如何在控制台窗口失去焦点时检测按键

如何在控制台窗口失去焦点时检测按键

问题描述:

我的应用程序使用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

我可以看到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的详细信息:这可以通过使用一个类似的方法来实现。

第三种方法,如果您想要捕捉每个按键,您将不得不使用的方法是设置低级别键盘钩子。