- Сообщения
- 5,379
- Репутация
- 2,724
AutoIt: 3.3.0.0
Версия: 1.62
Категория: Мышь и клавиатура
Описание: Устанавливает горячие клавиши для вызова пользовательских функций.
Основные отличия от HotKeySet():
*Вы можете назначить в качестве горячей клавиши CTRL+ALT+DEL, но не сможете блокировать вызов "Диспетчера задач" (Windows Task Manager).
Синтаксис и параметры:
Пример 1:
Пример 2:
Пример 3:
Источник: HotKey UDF (оффициальный форум)
Автор: Yashied
Примечания:
Версия: 1.62
Категория: Мышь и клавиатура
Описание: Устанавливает горячие клавиши для вызова пользовательских функций.
Основные отличия от HotKeySet():
- Возможность установить абсолютно любые горячие клавиши, включая такие как CTRL+ALT+DEL*, F12, WIN+... и т.д. Исключение составляют лишь такие специфические клавиши как Fn и подобные ей, которые не имеют собственного скан-кода.
- Возможность установить горячие клавиши, которые уже заняты другими приложениями.
- Возможность установить горячие клавиши только для определенных окон.
- Можно блокировать горячие клавиши для других приложений или пропускать их дальше (ниже) по цепочке хуков.
- Блокировка повторных вызовов при удержании горячей клавиши.
- Блокировка вызова пользовательской функции до завершения обработки предыдущего вызова.
- Отключение установленных ранее горячих клавиш без удаления хука из цепочки хуков, т.е без потери "приоритета".
- Для назначения горячих клавиш используется целочисленные значения, соответствующие таблице Virtual-Key Codes, а не их строковые "аббревиатуры".
*Вы можете назначить в качестве горячей клавиши CTRL+ALT+DEL, но не сможете блокировать вызов "Диспетчера задач" (Windows Task Manager).
Синтаксис и параметры:
Синтаксис вызова:
Параметры:
$iKey
16-битный код горячей клавиши, который состоит из младшего (VK - Virtual Key) и старшего (CK - Command Key) байтов. Значения битов для этих байтов показаны ниже.
Вы можете использовать функцию BitOR() для объединения VK- и CK-значений. Код клавиши не может состоять только из одного(их) CK-значения. Так же, не допускается использование более одного VK-значения. Функция не делает различий между левыми и правыми вспомогательными клавишами. Например, нельзя назначить горячую клавишу с использованием только левой клавиши CTRL. Это так же будет работать и для правой клавиши. Ниже показаны примеры допустимых и недопустимых комбинаций.
Допустимые комбинации:
Недопустимые комбинации:
$sFunction (Опционально)
Название функции, которая будет вызвана при нажатии горячей клавиши $iKey. Если этот параметра равен нулю (по умолчанию), то горячая клавиша будет удалена из списка. Если в списке больше нет установленных горячих клавиш, то хук автоматически будет удален из цепочки хуков (для предотвращения этого используйте флаг $HK_FLAG_NOUNHOOK). Указанная функция должна иметь следующий заголовок:
или (в зависимости от флага $HK_FLAG_EXTENDEDCALL)
Не пытайтесь вызывать _HotKeyAssign(), _HotKeyEnable(), _HotKeyDisable() или _HotKeyRelease() из этой функции, это не является хорошей идеей. В любом случае это не будет работать, перечисленные выше функции будут возвращать ошибку и флаг @extended будет установлен в (-1). Тем не менее этого можно избежать (см. $HK_FLAG_NOERROR).
$iFlags (Опционально)
Управляющие флаги. Этот параметр может содержать одно или несколько из нижеперечисленных значений.
$sTitle (Опционально)
Название окна, для которого необходимо установить горячую клавишу. Этот параметр аналогичен идентичному параметру для WinActive() функции. Если $sTitle равен нулю (по умолчанию), то указанная горячая клавиша будет работать для всех окон в системе.
Код:
_HotKeyAssign ( $iKey [, $sFunction [, $iFlags [, $sTitle]]] )
Параметры:
$iKey
16-битный код горячей клавиши, который состоит из младшего (VK - Virtual Key) и старшего (CK - Command Key) байтов. Значения битов для этих байтов показаны ниже.
0-7 | Определяет код горячей клавиши из таблицы Virtual-Key Codes. В файле vkConstants.au3 находятся значения кодов для всех этих клавиш. Коды клавиш мыши (0x01 - 0x06) и вспомогательных клавиш (0x11, 0x12 и т.д) не поддерживаются. |
8 | Задает клавишу SHIFT. |
9 | Задает клавишу CTRL. |
10 | Задает клавишу ALT. |
11 | Задает клавишу WIN. |
12-15 | Не используются и должны быть установлены в нулевое значение. |
Вы можете использовать функцию BitOR() для объединения VK- и CK-значений. Код клавиши не может состоять только из одного(их) CK-значения. Так же, не допускается использование более одного VK-значения. Функция не делает различий между левыми и правыми вспомогательными клавишами. Например, нельзя назначить горячую клавишу с использованием только левой клавиши CTRL. Это так же будет работать и для правой клавиши. Ниже показаны примеры допустимых и недопустимых комбинаций.
Допустимые комбинации:
Код:
; SHIFT+F12
BitOR($CK_SHIFT, $VK_F12)
; SHIFT+A
BitOR($CK_SHIFT, $VK_A)
; CTRL+ALT+TAB
BitOR($CK_CONTROL, $CK_ALT, $VK_TAB)
Недопустимые комбинации:
Код:
; SHIFT+WIN
BitOR($CK_SHIFT, $CK_WIN)
; CTRL+Q+W
BitOR($CK_CONTROL, $VK_Q, $VK_W)
$sFunction (Опционально)
Название функции, которая будет вызвана при нажатии горячей клавиши $iKey. Если этот параметра равен нулю (по умолчанию), то горячая клавиша будет удалена из списка. Если в списке больше нет установленных горячих клавиш, то хук автоматически будет удален из цепочки хуков (для предотвращения этого используйте флаг $HK_FLAG_NOUNHOOK). Указанная функция должна иметь следующий заголовок:
Код:
Func _MyFunc()
или (в зависимости от флага $HK_FLAG_EXTENDEDCALL)
Код:
Func _MyFunc($iKey)
Не пытайтесь вызывать _HotKeyAssign(), _HotKeyEnable(), _HotKeyDisable() или _HotKeyRelease() из этой функции, это не является хорошей идеей. В любом случае это не будет работать, перечисленные выше функции будут возвращать ошибку и флаг @extended будет установлен в (-1). Тем не менее этого можно избежать (см. $HK_FLAG_NOERROR).
$iFlags (Опционально)
Управляющие флаги. Этот параметр может содержать одно или несколько из нижеперечисленных значений.
$HK_FLAG_NOBLOCKHOTKEY | Предотвращает блокировку горячей клавиши для других приложений, стоящих ниже в цепочке хуков. Например, если необходимо зарегистрировать сам факт нажатия горячей клавиши (aka шпионим), но оставить возможность использовать эту клавишу другим приложениям. Таким образом, горячая клавиша будет работать в системе так, как и было до ее установки. |
$HK_FLAG_NOUNHOOK | Предотвращает удаление хука из цепочки хуков. Это может понадобиться, когда необходимо сохранить "приоритет" в цепочке хуков. Например, два приложения установили для себя одну и ту же горячую клавишу. В том случае, если первое приложение удалит горячую клавишу, а затем ее установит снова, оно автоматически получит приоритет над этой горячей клавишей, а второе приложение будет лишено возможности использовать указанную клавишу. Использование этого флага не допускает таких рокировок. Используется только при удалении горячей клавиши. |
$HK_FLAG_NOOVERLAPCALL | Предотвращает вызов пользовательской функции, если обработка предыдущего вызова (не обязательно для этой же горячей клавиши) не была завершена. Может понадобиться для синхронизации работы внутри программы. В основном используется для функций, которые приостанавливают работу основного цикла. Например, пользовательская функция использует функцию MsgBox() или создает свой собственный графический интерфейс. |
$HK_FLAG_NOREPEAT | Предотвращает повторный вызов горячей клавиши, в случае ее удержания. Если этот флаг установлен, то функция будет вызвана только один раз при каждом нажатии горячей клавиши. Может понадобиться, когда горячая клавиша используется, например, для увеличени или уменьшения громкости звука в соответствующих программах. |
$HK_FLAG_NOERROR | Предотвращает возвращение ошибки, в случае, если из пользовательской функции вызывается любая функция (_HotKeyAssign(), _HotKeyEnable(), _HotKeyDisable() или _HotKeyRelease()) из этой библиотеки. Без этого флага все вышеперечисленные функции будут возвращать ошибку и устанавливать @extended в (-1). Этот флаг нужно использовать с осторожностью, так как неправильное удаление или выключение горячей клавиши непосредственно из ее функции обработки может вызвать сбои в программе или ее полное зависание. |
$HK_FLAG_EXTENDEDCALL | Передает в пользовательскую функцию 16-битный код нажатой горячей клавиши (аналогичный параметру $iKey). Это может понадобиться для определения нажатой клавиши, в случае, когда одна и та же функция была назначена для нескольких горячих клавиш. Если установлен этот флаг, то заголовок функции должен иметь следующий вид: Func _MyFunc($iKey) |
$HK_FLAG_WAIT | Останавливает выполнение программы до тех пор, пока выполнение пользовательской функции не будет завершено. Если используется этот флаг, то $HK_FLAG_NOOVERLAPCALL не имеет никакого смысла и будет игнорирован. Применяется в основном для совместимости с программами, написанными с использованием более ранних версий (1.5 и ниже) HotKey библиотек. В большинстве случаев этот флаг не нужен. |
$HK_FLAG_DEFAULT | Комбинация $HK_FLAG_NOOVERLAPCALL и $HK_FLAG_NOREPEAT флагов. Используется по умолчанию или в случае, когда значение параметра $iFlags равно (-1). |
$sTitle (Опционально)
Название окна, для которого необходимо установить горячую клавишу. Этот параметр аналогичен идентичному параметру для WinActive() функции. Если $sTitle равен нулю (по умолчанию), то указанная горячая клавиша будет работать для всех окон в системе.
Пример 1:
Код:
#Include <HotKey.au3>
Global Const $VK_ESCAPE = 0x1B
Global Const $VK_F12 = 0x7B
; Assign "F12" with Message() and set extended function call
_HotKeyAssign($VK_F12, 'Message', BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
; Assign "CTRL-ESC" with Quit()
_HotKeyAssign(BitOR($CK_CONTROL, $VK_ESCAPE), 'Quit')
While 1
Sleep(10)
WEnd
Func Message($iKey)
MsgBox(0, 'Hot key Test Message', 'F12 (0x' & Hex($iKey, 4) & ') has been pressed!')
EndFunc ;==>Message
Func Quit()
Exit
EndFunc ;==>Quit
Пример 2:
Код:
#Include <HotKey.au3>
Global Const $VK_OEM_PLUS = 0xBB
Global Const $VK_OEM_MINUS = 0xBD
Global $Form, $Label
Global $i = 0
$Form = GUICreate('MyGUI', 200, 200)
$Label = GUICtrlCreateLabel($i, 20, 72, 160, 52, 0x01)
GUICtrlSetFont(-1, 32, 400, 0, 'Tahoma')
GUISetState()
; Assign "CTRL-(+)" with MyFunc1() and "CTRL-(-)" with MyFunc2() for created window only
_HotKeyAssign(BitOR($CK_CONTROL, $VK_OEM_PLUS), 'MyFunc1', 0, $Form)
_HotKeyAssign(BitOR($CK_CONTROL, $VK_OEM_MINUS), 'MyFunc2', 0, $Form)
Do
Until GUIGetMsg() = -3
Func MyFunc1()
$i += 1
GUICtrlSetData($Label, $i)
EndFunc ;==>MyFunc1
Func MyFunc2()
$i -= 1
GUICtrlSetData($Label, $i)
EndFunc ;==>MyFunc2
Пример 3:
Код:
#Include <GUIConstants.au3>
#Include <HotKey.au3>
Global Const $VK_ESCAPE = 0x1B
Global Const $VK_F12 = 0x7B
; Assign "F12" with Form()
_HotKeyAssign($VK_F12, 'Form')
; Assign "CTRL-ESC" with Quit()
_HotKeyAssign(BitOR($CK_CONTROL, $VK_ESCAPE), 'Quit')
While 1
Sleep(10)
WEnd
Func Form()
Local $Form, $Button, $Msg
$Form = GUICreate('MyGUI', 350, 350, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
$Button = GUICtrlCreateButton('Exit', 140, 315, 70, 23)
GUICtrlSetState(-1, BitOR($GUI_DEFBUTTON, $GUI_FOCUS))
GUISetState(@SW_SHOW, $Form)
While 1
Switch GUIGetMsg()
Case $Button, $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
GUIDelete($Form)
EndFunc ;==>Form
Func Quit()
Exit
EndFunc ;==>Quit
Источник: HotKey UDF (оффициальный форум)
Автор: Yashied
Примечания:
- В основе работы данной библиотеки лежит незыблемый принцип - очередная горячая клавиша не будет обрабатываться до тех пор, пока не отжаты все остальные установленные горячие клавиши. Другими словами, библиотека не поддерживает работу с более чем одной горячей клавишей одновременно.
- Исходя из предыдущего следует, что для геймеров эта библиотека (в некоторых случаях) может быть мала полезна.
- Описания (на английском) для других функций из этой библиотеки находятся внутри самого файла и не представляют из себя ничего сложного.
- Вы можете скачать (опционально) файл vkConstants.au3, в котором находятся необходимые константы (VK, CK-константы включены непосредственно в библиотеку) для определения горячих клавиш.
- Вы так же можете скачать Beta версию HotKey библиотеки (HotKey_17b.au3), в которую добавлен флаг $HK_FLAG_POSTCALL, с помощью которого можно регистрировать отжатия горячих клавиш. Описание (на английском) находится внутри библиотеки. Это полностью рабочий модуль и в будущем (в зависимости от отзывов и пожеланий) статус Beta может быть снят без каких-либо изменений в коде.
- Вы можете использовать специально написанную для этого модуля библиотеку HotKeyInput, которая позволяет задавать и отображать в GUI горячие клавиши.
- HotKey и HotKey_17b тестировались в AutoIt 3.3.0.0 и 3.3.1.1 Beta на системах Windows XP Pro Service Pack 2 и Windows Vista Ultimate Service Pack 1.