Форум сайта python.su
Под Windows есть такой замечательный скриптовый язык - AutoHotkey. Он позволяет проделывать очень удобные и красивые вещи, например:
!+vk41::
MsgBox, Вы нажали Alt+Shift+A(лат.) или Alt+Shift+Ф(рус.).
Return
Отредактировано (Дек. 23, 2008 10:13:15)
Офлайн
через win api. Регистрируется hotkey, который будет работать до завершения программы. В pywin32 что то было на эту тему. Где то был у меня примерчик, чуть позже поищу…
Офлайн
А нельзя сделать скрытое окно GUI и обрабатывать нажатия в нём, более высокоуровневыми способами?
Хотя, наверное, такое окно не получит никаких нажатий…
Отредактировано (Дек. 23, 2008 11:41:20)
Офлайн
ага… нажатия отправляются окну, если только оно в фокусе, это как раз и есть “высокий уровень”
Офлайн
The gray Cardinalтакое окно получит только свои нажатия, а если нужно глобальные по виндой кроме как заюзать WinAPI вариантов кажется нет
А нельзя сделать скрытое окно GUI и обрабатывать нажатия в нём, более высокоуровневыми способами?
Хотя, наверное, такое окно не получит никаких нажатий…
Офлайн
Вообщем то есть win32api.GetKeyboardState(), если “вручную” реализовывать…
Офлайн
Ну в принципе, вот, накопал: pyHook.
Вот такой код у меня отлавливает нажатие любой клавиши в любом приложении:
# -*- coding: utf-8 -*-
import pythoncom, pyHook
import codecs, sys
outf = codecs.getwriter('cp866')(sys.stdout, errors='replace')
sys.stdout = outf
def OnKeyboardEvent(event):
if event.WindowName == None:
wnd = 'None'
else:
wnd = unicode(event.WindowName, 'cp1251')
print u'Окно: ', wnd
print u'Виртуальный код: ', event.KeyID
print u'Скан-код: ', event.ScanCode
print '=========='
return True # возврат True для посылки события другим обработчикам
hm = pyHook.HookManager() # создание hook manager
hm.KeyDown = OnKeyboardEvent # наблюдение за всеми событиями клавиатуры
hm.HookKeyboard() # установка hook'а
pythoncom.PumpMessages() # бесконечное ожидание
Офлайн
Но, кстати, если попытаться внутри процедуры OnKeyboardEvent использовать что-нибудь типа win32api.MessageBox, начинаются жуткие тормоза: при выводе MessageBox вся система подвисает намертво на несколько секунд, даже Диспетчер задач (а пользовательский ввод буферизуется, по ощущениям).
Почему так?
Офлайн