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

Python 如何在控制台窗口失去焦点时检测按键,python,winapi,msvcrt,Python,Winapi,Msvcrt,我的应用程序使用win32api.mouse\u event向控制台窗口外的屏幕区域发送鼠标单击。这会导致窗口失去焦点,因此无法使用msvcrt.kbhit检测按键。 我的问题是,如何在控制台窗口不可见/不活动的情况下实现类似的功能 编辑: 下面是示例代码。这只是一个基本的控制台版本。如果控制台消失,将其设置为保持在顶部。一旦它在控制台(100100)外发出咔嗒声,按下Esc键将不会中断循环。对于这样的问题,如何实施中断 import msvcrt, win32api, win32con pi

我的应用程序使用
win32api.mouse\u event
向控制台窗口外的屏幕区域发送鼠标单击。这会导致窗口失去焦点,因此无法使用
msvcrt.kbhit检测按键。

我的问题是,如何在控制台窗口不可见/不活动的情况下实现类似的功能

编辑:

下面是示例代码。这只是一个基本的控制台版本。如果控制台消失,将其设置为保持在顶部。一旦它在控制台(100100)外发出咔嗒声,按下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

我可以看到三种可能的方法。第一种方法是在鼠标单击后将窗口置于顶部,但是我认为这不是您希望发生的事情

第二种方法是使用热键,如果您只想使用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注册热键的更多信息,请查看


第三种方法是设置一个低级键盘钩子,如果你想抓住每一次按键,你就必须使用它。

也许这一种会奏效

import win32api
while True:
     state = win32api.GetKeyState(117)  #F6
     while state:
          state = win32api.GetKeyState(117)
          #do something
如果按F6键,即使控制台不可见,脚本也将停止,然后在再次按F6键时继续。
希望这有帮助

显示您的代码。我们无法猜出它出了什么问题而不看到它。好了,很抱歉:/