编程语言
首页 > 编程语言> > python – 如何在控制台窗口失去焦点时检测按键

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

作者:互联网

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

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

标签:python,winapi,msvcrt
来源: https://codeday.me/bug/20190901/1780408.html