Функция WM_HOTKEY

 ↑  ←  Описание функции


WM_HOTKEY

Сообщение выполняется при использовании зарегистрированных горячих клавиш для текущего процесса.

Параметры

Указанные параметры передаются системой.
$wParam Идентификатор, на который зарегистрирована горячая клавиша, целое число от 1001 и более
$lParam Двойное слово содержит модификатор и виртуальную клавишу:
    младшее слово - модификатор, который может быть комбинацией следующих значений
        MOD_ALT - клавиша Alt
        MOD_CONTROL - клавиша Ctrl
        MOD_SHIFT - клавиша Shift
        MOD_WIN - клавиша Windows
    старшее слово - виртуальная клавиша

Примечания

Смотрите функцию GUIRegisterMsg.

Пример

#include <WindowsConstants.au3>
#include <EditConstants.au3>
Global $k = 0
Global Const $HOTKEYF_SHIFT = 0x01
Global Const $HOTKEYF_CONTROL = 0x02
Global Const $HOTKEYF_ALT = 0x04
Global Const $MOD_ALT = 0x1
Global Const $MOD_SHIFT = 0x4

$hGUI = GUICreate("WM_HOTKEY (для теста Ctrl+A)", 560, 190)
$myedit = GUICtrlCreateEdit('Функция WM_HOTKEY выполняется при вызове зарегистрированных горячих клавиш. Каждой горячей клавише назначается идентификатор ID от 1001 и далее. Переменная $iModKey содержит сумму модификаторов (Shift=1, Ctrl=2, Alt=4), а переменная $sVirtKey - номер клавиши клавиатуры. Этот пример взят при разборе GuiHotKey.au3 и GuiHotKey_Example.au3 от rasim.' & @CRLF & 'Горячая клавиша действует даже когда окно неактивно, но при условии, что клавиша не была занята другим приложением запущенным ранее.', 10, 10, 540, 170, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_NOHIDESEL + $ES_WANTRETURN)
GUISetState()
Send("{END}")

GUIRegisterMsg(0x312, "WM_HOTKEY")

$sID = 1001
_GuiCtrlHotKey_RegisterHotkey($hGUI, $sID, StringUpper(Asc('A')), 'Ctrl') ; Ctrl + A
If @error Then MsgBox(0, 'Сообщение', 'Не удалось зарегистрировать Ctrl + A')
_GuiCtrlHotKey_RegisterHotkey($hGUI, $sID + 1, StringUpper(Asc('Q')), 'Alt') ; Alt + Q
If @error Then MsgBox(0, 'Сообщение', 'Не удалось зарегистрировать Alt + Q')
_GuiCtrlHotKey_RegisterHotkey($hGUI, $sID + 2, StringUpper(Asc('Q')), 'Ctrl+Alt') ; Ctrl + Alt + Q
If @error Then MsgBox(0, 'Сообщение', 'Не удалось зарегистрировать Ctrl + Alt + Q')

Do
Until GUIGetMsg() = -3

Func WM_HOTKEY($hWnd, $Msg, $wParam, $lParam)
    $iModKey = BitAND($lParam, 0xFFFF) ; _WinAPI_LoWord
    $sVirtKey = BitShift($lParam, 16) ; _WinAPI_HiWord
    $iID = Number($wParam)
    $Res = ''
    If BitAND($iModKey, $HOTKEYF_CONTROL) Then $Res &= 'Ctrl+'
    If BitAND($iModKey, $MOD_SHIFT) Then $Res &= 'Shift+'
    If BitAND($iModKey, $MOD_ALT) Then $Res &= 'Alt+'

    Switch $iID
        Case 1001
            GUICtrlSendMsg($myedit, $EM_SETSEL, 0, -1)
        Case 1002
            MsgBox(0, 'Сообщение', 'Хоткей зарегистрированный на ID=1002')
        Case 1003
            MsgBox(0, 'Сообщение', 'Хоткей зарегистрированный на ID=1003')
    EndSwitch

    $k += 1
    WinSetTitle($hGUI, '', 'Вызов ' & $k & ' раз, Модификатор=' & $Res & ', Клавиша=' & Chr($sVirtKey) & ', ID=' & $iID)
EndFunc

;rasim, mod AZJIO
Func _GuiCtrlHotKey_RegisterHotkey($hWnd, $sID, $sVirtKey, $sModKey)
    Local $iModKey = 0
   
    If StringInStr($sModKey, 'Shift') Then $iModKey = BitOR($iModKey, $MOD_SHIFT)
    If StringInStr($sModKey, 'Ctrl') Then $iModKey = BitOR($iModKey, $HOTKEYF_CONTROL)
    If StringInStr($sModKey, 'Alt') Then $iModKey = BitOR($iModKey, $MOD_ALT)
   
    $aRet = DllCall("user32.dll", "int", "RegisterHotKey", _
            "hwnd", $hWnd, _
            "int", $sID, _
            "int", $iModKey, _
            "int", "0x" & Hex($sVirtKey, 2))
   
    Return SetError(Not $aRet[0], 0, $aRet[0])
EndFunc