我的应用程序使用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 :(得分:5)
我可以看到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。
第三种方法,如果你想抓住每一次按键,你必须使用它,就是设置一个低级键盘钩。
答案 1 :(得分:0)
也许这将起作用。
import win32api
while True:
state = win32api.GetKeyState(117) #F6
while state:
state = win32api.GetKeyState(117)
#do something
如果按F6键,即使控制台不可见,脚本也会停止,然后再按一次F6键会继续执行。 希望有帮助!