Advertisement
AZJIO

WM_HOTKEY

May 16th, 2012
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 3.31 KB | None | 0 0
  1. #include <WindowsConstants.au3>
  2. #include <EditConstants.au3>
  3. Global $k = 0
  4. Global Const $HOTKEYF_SHIFT = 0x01
  5. Global Const $HOTKEYF_CONTROL = 0x02
  6. Global Const $HOTKEYF_ALT = 0x04
  7. Global Const $MOD_ALT = 0x1
  8. Global Const $MOD_SHIFT = 0x4
  9.  
  10. $hGUI = GUICreate("Вызови хоткей Ctrl+A", 560, 190)
  11. $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)
  12. GUISetState()
  13. Send("{END}")
  14.  
  15. GUIRegisterMsg(0x312, "WM_HOTKEY")
  16.  
  17. $sID = 1001
  18. _GuiCtrlHotKey_RegisterHotkey($hGUI, $sID, StringUpper(Asc('A')), 'Ctrl') ; Ctrl + A
  19. If @error Then MsgBox(0, 'Сообщение', 'Не удалось зарегистрировать Ctrl + A')
  20. _GuiCtrlHotKey_RegisterHotkey($hGUI, $sID + 1, StringUpper(Asc('Q')), 'Alt') ; Alt + Q
  21. If @error Then MsgBox(0, 'Сообщение', 'Не удалось зарегистрировать Alt + Q')
  22. _GuiCtrlHotKey_RegisterHotkey($hGUI, $sID + 2, StringUpper(Asc('Q')), 'Ctrl+Alt') ; Ctrl + Alt + Q
  23. If @error Then MsgBox(0, 'Сообщение', 'Не удалось зарегистрировать Ctrl + Alt + Q')
  24.  
  25. Do
  26. Until GUIGetMsg() = -3
  27.  
  28. Func WM_HOTKEY($hWnd, $Msg, $wParam, $lParam)
  29.     $iModKey = BitAND($lParam, 0xFFFF) ; _WinAPI_LoWord
  30.     $sVirtKey = BitShift($lParam, 16) ; _WinAPI_HiWord
  31.     $iID = Number($wParam)
  32.     $Res = ''
  33.     If BitAND($iModKey, $HOTKEYF_CONTROL) Then $Res &= 'Ctrl+'
  34.     If BitAND($iModKey, $MOD_SHIFT) Then $Res &= 'Shift+'
  35.     If BitAND($iModKey, $MOD_ALT) Then $Res &= 'Alt+'
  36.  
  37.     Switch $iID
  38.         Case 1001
  39.             GUICtrlSendMsg($myedit, $EM_SETSEL, 0, -1)
  40.         Case 1002
  41.             MsgBox(0, 'Сообщение', 'Хоткей зарегистрированный на ID=1002')
  42.         Case 1003
  43.             MsgBox(0, 'Сообщение', 'Хоткей зарегистрированный на ID=1003')
  44.     EndSwitch
  45.  
  46.     $k += 1
  47.     WinSetTitle($hGUI, '', 'Вызов ' & $k & ' раз, Модификатор=' & $Res & ', Клавиша=' & Chr($sVirtKey) & ', ID=' & $iID)
  48. EndFunc
  49.  
  50. ;rasim, mod AZJIO
  51. Func _GuiCtrlHotKey_RegisterHotkey($hWnd, $sID, $sVirtKey, $sModKey)
  52.     Local $iModKey = 0
  53.    
  54.     If StringInStr($sModKey, 'Shift') Then $iModKey = BitOR($iModKey, $MOD_SHIFT)
  55.     If StringInStr($sModKey, 'Ctrl') Then $iModKey = BitOR($iModKey, $HOTKEYF_CONTROL)
  56.     If StringInStr($sModKey, 'Alt') Then $iModKey = BitOR($iModKey, $MOD_ALT)
  57.    
  58.     $aRet = DllCall("user32.dll", "int", "RegisterHotKey", _
  59.             "hwnd", $hWnd, _
  60.             "int", $sID, _
  61.             "int", $iModKey, _
  62.             "int", "0x" & Hex($sVirtKey, 2))
  63.    
  64.     Return SetError(Not $aRet[0], 0, $aRet[0])
  65. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement