Найти - Пользователи
Полная версия: Обработка горячих клавиш
Начало » Python для новичков » Обработка горячих клавиш
1
The gray Cardinal
Под Windows есть такой замечательный скриптовый язык - AutoHotkey. Он позволяет проделывать очень удобные и красивые вещи, например:
!+vk41::
MsgBox, Вы нажали Alt+Shift+A(лат.) или Alt+Shift+Ф(рус.).
Return
Этот скрипт, будучи запущенным, никогда сам не завершит работу и будет перехватывать нажатие указанной горячей клавиши в любом приложении.

Возможно ли подобное организовать на Python достаточно универсальным способом? Каким образом?
igor.kaist
через win api. Регистрируется hotkey, который будет работать до завершения программы. В pywin32 что то было на эту тему. Где то был у меня примерчик, чуть позже поищу…
The gray Cardinal
А нельзя сделать скрытое окно GUI и обрабатывать нажатия в нём, более высокоуровневыми способами?
Хотя, наверное, такое окно не получит никаких нажатий…
igor.kaist
ага… нажатия отправляются окну, если только оно в фокусе, это как раз и есть “высокий уровень”
Quard
The gray Cardinal
А нельзя сделать скрытое окно GUI и обрабатывать нажатия в нём, более высокоуровневыми способами?
Хотя, наверное, такое окно не получит никаких нажатий…
такое окно получит только свои нажатия, а если нужно глобальные по виндой кроме как заюзать WinAPI вариантов кажется нет
igor.kaist
Вообщем то есть win32api.GetKeyboardState(), если “вручную” реализовывать…
The gray Cardinal
Ну в принципе, вот, накопал: 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() # бесконечное ожидание
The gray Cardinal
Но, кстати, если попытаться внутри процедуры OnKeyboardEvent использовать что-нибудь типа win32api.MessageBox, начинаются жуткие тормоза: при выводе MessageBox вся система подвисает намертво на несколько секунд, даже Диспетчер задач (а пользовательский ввод буферизуется, по ощущениям).
Почему так?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB