2013-04-03 2 views
2

Мое приложение отправляет щелчок мыши в область экрана за пределами моего окна консоли, используя win32api.mouse_event. Это заставляет мое окно терять фокус, поэтому я не могу обнаружить нажатия клавиш, используя msvcrt.kbhit.Как обнаружить нажатие клавиши, когда окно консоли потеряло фокус

Мой вопрос в том, как реализовать что-то подобное, когда окно консоли не отображается/активно?

EDIT:

Вот пример кода. Это просто базовая консольная версия. Если консоль исчезнет, ​​установите ее так, чтобы она оставалась сверху. Как только он щелкнет за пределами консоли (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

Показать Ваш код. Мы не можем догадаться, что с ним не так, не видя этого. –

+0

там мы идем, извините за это: / – user2122589

ответ

4

Я могу видеть 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.

Третий способ, которым вы должны были бы воспользоваться, если бы вы хотели поймать каждое нажатие клавиши, было бы установить крючок клавиатуры низкого уровня.

Смежные вопросы