|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Отслеживание нажатий клавиш на клавиатуре (чтоб узнать код нажатой клавиши) |
|
[решено] Отслеживание нажатий клавиш на клавиатуре (чтоб узнать код нажатой клавиши)
|
Старожил Сообщения: 307 |
Вопрос такой: нужно отслеживать нажатие клавиш на клавиатуре и если какая то клавиша нажата, вывести ее скан код, для примера, в ToolTip. (Хочу потом сделать чтото подобное, что есть у Punto Switcher-a, тоесть чтоб озвучивались нажатые клавиши в русской расскладке - одним звуком, в английской - другим, а в украинском - третьим. ) Есть код CreatoR-а: Ссылка, который я вот немного упростил, чтоб показать что мне нужно:
HotKeySet("{ESC}", "OnAutoItExit") Global Const $WH_KEYBOARD_LL = 13 Global $sBuffer = "" Global $hStub_KeyProc = DllCallbackRegister("_KeyProc", "int", "int;ptr;ptr") Global $hMod = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0) Global $hHook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", _ $WH_KEYBOARD_LL, "ptr", DllCallbackGetPtr($hStub_KeyProc), "hwnd", $hMod[0], "dword", 0) MsgBox(4096, "", "Type anything anywhere and it will appear in the top left corner of the screen.") While 1 Sleep(10) WEnd Func EvaluateKey($nKeyCode) $sBuffer= Chr($nKeyCode)&" - "&$nKeyCode ToolTip($sBuffer , 0, 80) EndFunc Func _KeyProc($nCode, $wParam, $lParam) Local $aRet, $KEYHOOKSTRUCT If $nCode < 0 Then $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam) Return $aRet[0] EndIf If $wParam = 256 Then $KEYHOOKSTRUCT = DllStructCreate("dword;dword;dword;dword;ptr", $lParam) EvaluateKey(DllStructGetData($KEYHOOKSTRUCT, 1)) EndIf $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam) Return $aRet[0] EndFunc Func OnAutoItExit() If $hStub_KeyProc Then DllCallbackFree($hStub_KeyProc) $hStub_KeyProc = 0 DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hHook[0]) If @HotKeyPressed <> "" Then Exit EndFunc |
|
------- Отправлено: 00:43, 22-08-2009 |
Старожил Сообщения: 307
|
Профиль | Отправить PM | Цитировать Цитата dasksting:
Если ты уже 2 день пытаешся, то думаю поймеш суть, сдесь я добавил клавишу <*>, код которой 106, по аналогии добавиш то что тебе нужно, кроме кнопки мыши конечно... Скрипт наверное можно оптимизировать, но на это нету времени, главное же суть. |
|
------- Отправлено: 11:07, 02-09-2010 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать обалдеть!!!!! Я бы без тебя вообще бы не разобрался, оказалось все очень даже просто, не думал в этом направлении!!!! СПАСИБО тебе ОГРОМНОЕ!!!
|
Отправлено: 07:15, 03-09-2010 | #12 |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать а допустим смотри, я прописал клавишу Enter, а как сделать чтобы он в тултипе выводил не 1 букву а слово Enter ?
|
Отправлено: 07:34, 03-09-2010 | #13 |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать |
Отправлено: 08:09, 03-09-2010 | #14 |
Старожил Сообщения: 307
|
Профиль | Отправить PM | Цитировать Цитата dasksting:
#include <Misc.au3> HotKeySet("{ESC}", "OnAutoItExit") _OnStart() Global Const $WH_KEYBOARD_LL = 13 Global $hStub_KeyProc = DllCallbackRegister("_Key_Proc", "int", "int;ptr;ptr") Global $hMod = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0) Global $hHook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", $WH_KEYBOARD_LL, _ "ptr", DllCallbackGetPtr($hStub_KeyProc), "hwnd", $hMod[0], "dword", 0) MsgBox(4096, "", "Type anything anywhere and it will appear in the top left corner of the screen.") While 1 Sleep(100) WEnd Func _EvaluateKey_Proc($nKeyCode) Local $sSound Local $sChar ;MsgBox(64,Chr($nKeyCode), $nKeyCode, 1) ;с помощью этого узнаем код нужной нам клавиши (только без shift, а то будет зависание) Switch $nKeyCode Case 65 To 90, 48 To 57, 186 To 192, 219, 221, 222, 106, 13 ; проверяться будут только нажатия на буквы и цифры и еще клавиши минус и плюс, что после клавиши 0, а код 106 соответствует клавише * на цифровой клавиатуре, 13 - код клавиши Enter Switch _WinGetKeyboardLayout(WinGetHandle("[ACTIVE]")) Case 0409 ;Если раскладка английская If _IsPressed(10) Then ; если нажата клавиша Shift $sChar=_ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aEngShift_Codes) Else ; если не нажата клавиша Shift $sChar=_ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aEng_Codes) EndIf $sSound = "en.wav" Case 0419 ;Если расскладка русская If _IsPressed(10) Then ; если нажата клавиша Shift $sChar=_ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aRusShift_Codes) Else ; если не нажата клавиша Shift $sChar=_ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aRus_Codes) EndIf $sSound = "ru.wav" Case 0422 ;Если расскладка украинская If _IsPressed(10) Then ; если нажата клавиша Shift $sChar=_ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aUkrShift_Codes) Else ; если не нажата клавиша Shift $sChar=_ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aUkr_Codes) EndIf $sSound = "ukr.wav" EndSwitch ToolTip($sChar, 0, 80) SoundPlay($sSound) ;проигрывать звук при нажатии Case Else ; если была нажата не буква и не цыфра, то выход из функции ToolTip("", 0, 80) Return EndSwitch EndFunc Func _Key_Proc($nCode, $wParam, $lParam) Local $aRet, $KEYHOOKSTRUCT If $nCode < 0 Then $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam) Return $aRet[0] EndIf If $wParam = 256 Then $KEYHOOKSTRUCT = DllStructCreate("dword;dword;dword;dword;ptr", $lParam) _EvaluateKey_Proc(DllStructGetData($KEYHOOKSTRUCT, 1)) EndIf $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam) Return $aRet[0] EndFunc ;Функция для замены кодов нажатых клавиш с массива Func _ReplaceKeyCode_Proc($nKeyCode, $aSearch_Array, $aReplace_Array) For $i = 1 To $aSearch_Array[0] If $nKeyCode==$aSearch_Array[$i]Then Return $aReplace_Array[$i] EndIf Next EndFunc ;функция позволяет узнать язык текущей расскладки клавиатуры Func _WinGetKeyboardLayout($hWnd) Local $aRet = DllCall("user32.dll", "long", "GetWindowThreadProcessId", "hwnd", $hWnd, "ptr", 0) $aRet = DllCall("user32.dll", "long", "GetKeyboardLayout", "long", $aRet[0]) Return "0000" & Hex($aRet[0], 4) EndFunc Func OnAutoItExit() If $hStub_KeyProc Then DllCallbackFree($hStub_KeyProc) $hStub_KeyProc = 0 DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hHook[0]) If @HotKeyPressed <> "" Then Exit EndFunc func _OnStart() Global $aEng_Codes[49] $aEng_Codes[0]=48 ;общее количество активных ячеек в массиве $aEng_Codes[1]="`" $aEng_Codes[2]="q" $aEng_Codes[3]="w" $aEng_Codes[4]="e" $aEng_Codes[5]="r" $aEng_Codes[6]="t" $aEng_Codes[7]="y" $aEng_Codes[8]="u" $aEng_Codes[9]="i" $aEng_Codes[10]="o" $aEng_Codes[11]="p" $aEng_Codes[12]="[" $aEng_Codes[13]="]" $aEng_Codes[14]="a" $aEng_Codes[15]="s" $aEng_Codes[16]="d" $aEng_Codes[17]="f" $aEng_Codes[18]="g" $aEng_Codes[19]="h" $aEng_Codes[20]="j" $aEng_Codes[21]="k" $aEng_Codes[22]="l" $aEng_Codes[23]=";" $aEng_Codes[24]="'" $aEng_Codes[25]="z" $aEng_Codes[26]="x" $aEng_Codes[27]="c" $aEng_Codes[28]="v" $aEng_Codes[29]="b" $aEng_Codes[30]="n" $aEng_Codes[31]="m" $aEng_Codes[32]="," $aEng_Codes[33]="." $aEng_Codes[34]="/" $aEng_Codes[35]="1" $aEng_Codes[36]="2" $aEng_Codes[37]="3" $aEng_Codes[38]="4" $aEng_Codes[39]="5" $aEng_Codes[40]="6" $aEng_Codes[41]="7" $aEng_Codes[42]="8" $aEng_Codes[43]="9" $aEng_Codes[44]="0" $aEng_Codes[45]="-" $aEng_Codes[46]="=" $aEng_Codes[47]="*" $aEng_Codes[48]="Enter" Global $aEngShift_Codes[49] $aEngShift_Codes[0]=48 $aEngShift_Codes[1]="~" $aEngShift_Codes[2]="Q" $aEngShift_Codes[3]="W" $aEngShift_Codes[4]="E" $aEngShift_Codes[5]="R" $aEngShift_Codes[6]="T" $aEngShift_Codes[7]="Y" $aEngShift_Codes[8]="U" $aEngShift_Codes[9]="I" $aEngShift_Codes[10]="O" $aEngShift_Codes[11]="P" $aEngShift_Codes[12]="{" $aEngShift_Codes[13]="}" $aEngShift_Codes[14]="A" $aEngShift_Codes[15]="S" $aEngShift_Codes[16]="D" $aEngShift_Codes[17]="F" $aEngShift_Codes[18]="G" $aEngShift_Codes[19]="H" $aEngShift_Codes[20]="J" $aEngShift_Codes[21]="K" $aEngShift_Codes[22]="L" $aEngShift_Codes[23]=":" $aEngShift_Codes[24]='"' $aEngShift_Codes[25]="Z" $aEngShift_Codes[26]="X" $aEngShift_Codes[27]="C" $aEngShift_Codes[28]="V" $aEngShift_Codes[29]="B" $aEngShift_Codes[30]="N" $aEngShift_Codes[31]="M" $aEngShift_Codes[32]="<" $aEngShift_Codes[33]=">" $aEngShift_Codes[34]="?" $aEngShift_Codes[35]="!" $aEngShift_Codes[36]="@" $aEngShift_Codes[37]="#" $aEngShift_Codes[38]="$" $aEngShift_Codes[39]="%" $aEngShift_Codes[40]="^" $aEngShift_Codes[41]="&" $aEngShift_Codes[42]="*" $aEngShift_Codes[43]="(" $aEngShift_Codes[44]=")" $aEngShift_Codes[45]="_" $aEngShift_Codes[46]="+" $aEngShift_Codes[47]="*" $aEngShift_Codes[48]="Enter" Global $aRus_Codes[49] $aRus_Codes[0]=48 $aRus_Codes[1]="ё" $aRus_Codes[2]="й" $aRus_Codes[3]="ц" $aRus_Codes[4]="у" $aRus_Codes[5]="к" $aRus_Codes[6]="е" $aRus_Codes[7]="н" $aRus_Codes[8]="г" $aRus_Codes[9]="ш" $aRus_Codes[10]="щ" $aRus_Codes[11]="з" $aRus_Codes[12]="х" $aRus_Codes[13]="ъ" $aRus_Codes[14]="ф" $aRus_Codes[15]="ы" $aRus_Codes[16]="в" $aRus_Codes[17]="а" $aRus_Codes[18]="п" $aRus_Codes[19]="р" $aRus_Codes[20]="о" $aRus_Codes[21]="л" $aRus_Codes[22]="д" $aRus_Codes[23]="ж" $aRus_Codes[24]="э" $aRus_Codes[25]="я" $aRus_Codes[26]="ч" $aRus_Codes[27]="с" $aRus_Codes[28]="м" $aRus_Codes[29]="и" $aRus_Codes[30]="т" $aRus_Codes[31]="ь" $aRus_Codes[32]="б" $aRus_Codes[33]="ю" $aRus_Codes[34]="." $aRus_Codes[35]="1" $aRus_Codes[36]="2" $aRus_Codes[37]="3" $aRus_Codes[38]="4" $aRus_Codes[39]="5" $aRus_Codes[40]="6" $aRus_Codes[41]="7" $aRus_Codes[42]="8" $aRus_Codes[43]="9" $aRus_Codes[44]="0" $aRus_Codes[45]="-" $aRus_Codes[46]="=" $aRus_Codes[47]="*" $aRus_Codes[48]="Enter" Global $aRusShift_Codes[49] $aRusShift_Codes[0]=48 $aRusShift_Codes[1]="Ё" $aRusShift_Codes[2]="Й" $aRusShift_Codes[3]="Ц" $aRusShift_Codes[4]="У" $aRusShift_Codes[5]="К" $aRusShift_Codes[6]="Е" $aRusShift_Codes[7]="Н" $aRusShift_Codes[8]="Г" $aRusShift_Codes[9]="Ш" $aRusShift_Codes[10]="Щ" $aRusShift_Codes[11]="З" $aRusShift_Codes[12]="Х" $aRusShift_Codes[13]="Ъ" $aRusShift_Codes[14]="Ф" $aRusShift_Codes[15]="Ы" $aRusShift_Codes[16]="В" $aRusShift_Codes[17]="А" $aRusShift_Codes[18]="П" $aRusShift_Codes[19]="Р" $aRusShift_Codes[20]="О" $aRusShift_Codes[21]="Л" $aRusShift_Codes[22]="Д" $aRusShift_Codes[23]="Ж" $aRusShift_Codes[24]="Э" $aRusShift_Codes[25]="Я" $aRusShift_Codes[26]="Ч" $aRusShift_Codes[27]="С" $aRusShift_Codes[28]="М" $aRusShift_Codes[29]="И" $aRusShift_Codes[30]="Т" $aRusShift_Codes[31]="Ь" $aRusShift_Codes[32]="Б" $aRusShift_Codes[33]="Ю" $aRusShift_Codes[34]="," $aRusShift_Codes[35]="!" $aRusShift_Codes[36]='"' $aRusShift_Codes[37]="№" $aRusShift_Codes[38]=";" $aRusShift_Codes[39]="%" $aRusShift_Codes[40]=":" $aRusShift_Codes[41]="?" $aRusShift_Codes[42]="*" $aRusShift_Codes[43]="(" $aRusShift_Codes[44]=")" $aRusShift_Codes[45]="_" $aRusShift_Codes[46]="+" $aRusShift_Codes[47]="*" $aRusShift_Codes[48]="Enter" Global $aUkr_Codes[49] $aUkr_Codes[0]=48 $aUkr_Codes[1]="'" $aUkr_Codes[2]="й" $aUkr_Codes[3]="ц" $aUkr_Codes[4]="у" $aUkr_Codes[5]="к" $aUkr_Codes[6]="е" $aUkr_Codes[7]="я" $aUkr_Codes[8]="г" $aUkr_Codes[9]="ш" $aUkr_Codes[10]="щ" $aUkr_Codes[11]="з" $aUkr_Codes[12]="х" $aUkr_Codes[13]="ї" $aUkr_Codes[14]="ф" $aUkr_Codes[15]="і" $aUkr_Codes[16]="в" $aUkr_Codes[17]="а" $aUkr_Codes[18]="п" $aUkr_Codes[19]="р" $aUkr_Codes[20]="о" $aUkr_Codes[21]="л" $aUkr_Codes[22]="д" $aUkr_Codes[23]="ж" $aUkr_Codes[24]="є" $aUkr_Codes[25]="н" $aUkr_Codes[26]="ч" $aUkr_Codes[27]="с" $aUkr_Codes[28]="м" $aUkr_Codes[29]="и" $aUkr_Codes[30]="т" $aUkr_Codes[31]="ь" $aUkr_Codes[32]="б" $aUkr_Codes[33]="ю" $aUkr_Codes[34]="." $aUkr_Codes[35]="1" $aUkr_Codes[36]="2" $aUkr_Codes[37]="3" $aUkr_Codes[38]="4" $aUkr_Codes[39]="5" $aUkr_Codes[40]="6" $aUkr_Codes[41]="7" $aUkr_Codes[42]="8" $aUkr_Codes[43]="9" $aUkr_Codes[44]="0" $aUkr_Codes[45]="-" $aUkr_Codes[46]="=" $aUkr_Codes[47]="*" $aUkr_Codes[48]="Enter" Global $aUkrShift_Codes[49] $aUkrShift_Codes[0]=48 $aUkrShift_Codes[1]="’" $aUkrShift_Codes[2]="Й" $aUkrShift_Codes[3]="Ц" $aUkrShift_Codes[4]="У" $aUkrShift_Codes[5]="К" $aUkrShift_Codes[6]="Е" $aUkrShift_Codes[7]="Я" $aUkrShift_Codes[8]="Г" $aUkrShift_Codes[9]="Ш" $aUkrShift_Codes[10]="Щ" $aUkrShift_Codes[11]="З" $aUkrShift_Codes[12]="Х" $aUkrShift_Codes[13]="Ї" $aUkrShift_Codes[14]="Ф" $aUkrShift_Codes[15]="І" $aUkrShift_Codes[16]="В" $aUkrShift_Codes[17]="А" $aUkrShift_Codes[18]="П" $aUkrShift_Codes[19]="Р" $aUkrShift_Codes[20]="О" $aUkrShift_Codes[21]="Л" $aUkrShift_Codes[22]="Д" $aUkrShift_Codes[23]="Ж" $aUkrShift_Codes[24]="Є" $aUkrShift_Codes[25]="Н" $aUkrShift_Codes[26]="Ч" $aUkrShift_Codes[27]="С" $aUkrShift_Codes[28]="М" $aUkrShift_Codes[29]="И" $aUkrShift_Codes[30]="Т" $aUkrShift_Codes[31]="Ь" $aUkrShift_Codes[32]="Б" $aUkrShift_Codes[33]="Ю" $aUkrShift_Codes[34]="," $aUkrShift_Codes[35]="!" $aUkrShift_Codes[36]='"' $aUkrShift_Codes[37]="№" $aUkrShift_Codes[38]=";" $aUkrShift_Codes[39]="%" $aUkrShift_Codes[40]=":" $aUkrShift_Codes[41]="?" $aUkrShift_Codes[42]="*" $aUkrShift_Codes[43]="(" $aUkrShift_Codes[44]=")" $aUkrShift_Codes[45]="_" $aUkrShift_Codes[46]="+" $aUkrShift_Codes[47]="*" $aUkrShift_Codes[48]="Enter" ; Global $aCapture_Codes[49] $aCapture_Codes[0]=48 ;общее кол. акт. ячеек массива $aCapture_Codes[1]=192 $aCapture_Codes[2]=81 $aCapture_Codes[3]=87 $aCapture_Codes[4]=69 $aCapture_Codes[5]=82 $aCapture_Codes[6]=84 $aCapture_Codes[7]=89 $aCapture_Codes[8]=85 $aCapture_Codes[9]=73 $aCapture_Codes[10]=79 $aCapture_Codes[11]=80 $aCapture_Codes[12]=219 $aCapture_Codes[13]=221 $aCapture_Codes[14]=65 $aCapture_Codes[15]=83 $aCapture_Codes[16]=68 $aCapture_Codes[17]=70 $aCapture_Codes[18]=71 $aCapture_Codes[19]=72 $aCapture_Codes[20]=74 $aCapture_Codes[21]=75 $aCapture_Codes[22]=76 $aCapture_Codes[23]=186 $aCapture_Codes[24]=222 $aCapture_Codes[25]=90 $aCapture_Codes[26]=88 $aCapture_Codes[27]=67 $aCapture_Codes[28]=86 $aCapture_Codes[29]=66 $aCapture_Codes[30]=78 $aCapture_Codes[31]=77 $aCapture_Codes[32]=188 $aCapture_Codes[33]=190 $aCapture_Codes[34]=191 $aCapture_Codes[35]=49 $aCapture_Codes[36]=50 $aCapture_Codes[37]=51 $aCapture_Codes[38]=52 $aCapture_Codes[39]=53 $aCapture_Codes[40]=54 $aCapture_Codes[41]=55 $aCapture_Codes[42]=56 $aCapture_Codes[43]=57 $aCapture_Codes[44]=48 $aCapture_Codes[45]=189 $aCapture_Codes[46]=187 $aCapture_Codes[47]=106 ;* на цифровой клавиатуре $aCapture_Codes[48]=13 ;Код клавиши Enter EndFunc |
|
------- Отправлено: 15:06, 03-09-2010 | #15 |
![]() Ветеран Сообщения: 753
|
Профиль | Отправить PM | Цитировать У меня почему то всеровно с цифровой клавиатуры набор не идёт, не могу понять как сделать, какие кода символов...
|
------- Отправлено: 10:17, 21-02-2011 | #16 |
Новый участник Сообщения: 1
|
Профиль | Отправить PM | Цитировать beve
Что то не пойму через что он цикл проверки крутит Там же голый цикл со слипом и функции Через что эти функции вызывваются? |
Отправлено: 01:54, 23-03-2015 | #17 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата RRAVSS:
Цитата beve:
|
||
Отправлено: 02:14, 23-03-2015 | #18 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Какая разница между пирамидальной и обычной раскладкой клавиш на клавиатуре? | Sev | Флейм | 2 | 17-02-2009 12:01 | |
[решено] Горячие клавиши на Клавиатуре. | krema | Хочу все знать | 2 | 04-02-2009 22:52 | |
Как назначить кнопкам джойстика функцию нажатой клавиши на клаве. | spiritmen | Игры | 4 | 05-06-2007 13:44 |
|