【问题标题】:How to detect key press when the console window has lost focus控制台窗口失去焦点时如何检测按键
【发布时间】:2013-04-03 02:11:40
【问题描述】:

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

【问题讨论】:

  • 显示您的代码。没有看到它,我们无法猜测它有什么问题。
  • 我们走了,很抱歉:/

标签: python winapi msvcrt


【解决方案1】:

我可以看到 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

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

【讨论】:

    【解决方案2】:

    也许这个会起作用。

    import win32api
    while True:
         state = win32api.GetKeyState(117)  #F6
         while state:
              state = win32api.GetKeyState(117)
              #do something
    

    如果按 F6,即使控制台不可见,脚本也会停止,然后再按一次 F6 继续。 希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2023-03-24
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多