如何在控制台窗口失去焦点时检测按键
问题描述:
我的应用程序使用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
答
我可以看到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的详细信息:这可以通过使用一个类似的方法来实现。
第三种方法,如果您想要捕捉每个按键,您将不得不使用的方法是设置低级别键盘钩子。
显示您的代码。没有看到它,我们无法猜测它有什么问题。 –
我们走了,对不起:/ – user2122589