Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 23, 2008 10:12:57

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка горячих клавиш

Под Windows есть такой замечательный скриптовый язык - AutoHotkey. Он позволяет проделывать очень удобные и красивые вещи, например:

!+vk41::
MsgBox, Вы нажали Alt+Shift+A(лат.) или Alt+Shift+Ф(рус.).
Return
Этот скрипт, будучи запущенным, никогда сам не завершит работу и будет перехватывать нажатие указанной горячей клавиши в любом приложении.

Возможно ли подобное организовать на Python достаточно универсальным способом? Каким образом?



Отредактировано (Дек. 23, 2008 10:13:15)

Офлайн

#2 Дек. 23, 2008 11:36:01

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Обработка горячих клавиш

через win api. Регистрируется hotkey, который будет работать до завершения программы. В pywin32 что то было на эту тему. Где то был у меня примерчик, чуть позже поищу…



Офлайн

#3 Дек. 23, 2008 11:39:01

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка горячих клавиш

А нельзя сделать скрытое окно GUI и обрабатывать нажатия в нём, более высокоуровневыми способами?
Хотя, наверное, такое окно не получит никаких нажатий…



Отредактировано (Дек. 23, 2008 11:41:20)

Офлайн

#4 Дек. 23, 2008 11:53:09

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Обработка горячих клавиш

ага… нажатия отправляются окну, если только оно в фокусе, это как раз и есть “высокий уровень”



Офлайн

#5 Дек. 23, 2008 11:54:39

Quard
От:
Зарегистрирован: 2008-12-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка горячих клавиш

The gray Cardinal
А нельзя сделать скрытое окно GUI и обрабатывать нажатия в нём, более высокоуровневыми способами?
Хотя, наверное, такое окно не получит никаких нажатий…
такое окно получит только свои нажатия, а если нужно глобальные по виндой кроме как заюзать WinAPI вариантов кажется нет



Офлайн

#6 Дек. 23, 2008 12:10:43

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Обработка горячих клавиш

Вообщем то есть win32api.GetKeyboardState(), если “вручную” реализовывать…



Офлайн

#7 Дек. 23, 2008 13:19:17

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка горячих клавиш

Ну в принципе, вот, накопал: 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() # бесконечное ожидание



Офлайн

#8 Дек. 23, 2008 13:30:08

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка горячих клавиш

Но, кстати, если попытаться внутри процедуры OnKeyboardEvent использовать что-нибудь типа win32api.MessageBox, начинаются жуткие тормоза: при выводе MessageBox вся система подвисает намертво на несколько секунд, даже Диспетчер задач (а пользовательский ввод буферизуется, по ощущениям).
Почему так?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version