Старожил
Сообщения: 307
Благодарности: 137
|
Профиль
|
Отправить PM
| Цитировать
Цитата Creat0R:
Но могу предложить использовать всё же мой метод, с реальными буквами в массиве, а не кодами - так будет легче для разбора в дальнейшем. »
|
Согласился и переделал. Кажись теперь всё  :
Код: 
#include <Misc.au3>
HotKeySet("{ESC}", "OnAutoItExit")
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 $sCapt_Codes, $sEng_Codes, $sEngShift_Codes, $sRus_Codes, $sRusShift_Codes
Local $sUkr_Codes, $sUkrShift_Codes
Local $aCapture_Codes, $aEng_Codes, $aEngShift_Codes, $aRus_Codes, $aRusShift_Codes, $aUkr_Codes, $aUkrShift_Codes
Local $sSound
Local $sChar
Switch $nKeyCode
Case 65 To 90, 48 To 57, 186 To 192, 219, 221, 222 ; проверяться будут только нажатия на буквы и цифры и еще клавиши минус и плюс, что после клавиши 0.
$sCapt_Codes = _
"АQWERTYUIOPЫЭASDFGHJKLєЮZXCVBNMјѕї" & _
"1234567890Ѕ»"
$sEng_Codes = _
"`qwertyuiop[]asdfghjkl;'zxcvbnm,./" & _
"1234567890-="
$sEngShift_Codes = _
'~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?' & _
'!@#$%^&*()_+'
$sRus_Codes = _
"ёйцукенгшщзхъфывапролджэячсмитьбю." & _
"1234567890-="
$sRusShift_Codes = _
'ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,' & _
'!"№;%:?*()_+'
$sUkr_Codes = _
"'йцукеягшщзхЇфівапролджєнчсмитьбю." & _
"1234567890-="
$sUkrShift_Codes = _
"’ЙЦУКЕЯГШЩЗХЇФІВАПРОЛДЖЄНЧСМИТЬБЮ," & _
'!"№;%:?*()_+'
$aCapture_Codes = StringSplit($sCapt_Codes, "")
$aEng_Codes = StringSplit($sEng_Codes, "")
$aEngShift_Codes = StringSplit($sEngShift_Codes, "")
$aRus_Codes = StringSplit($sRus_Codes, "")
$aRusShift_Codes = StringSplit($sRusShift_Codes, "")
$aUkr_Codes = StringSplit($sUkr_Codes, "")
$aUkrShift_Codes = StringSplit($sUkrShift_Codes, "")
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 & " - " & Asc($sChar), 0, 80)
SoundPlay($sSound) ;проигрывать звук при нажатии
Case Else ; если была нажата не буква и не цыфра, то выход из функции
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==Asc($aSearch_Array[$i]) Then
$nKeyCode=Asc($aReplace_Array[$i])
Return Chr($nKeyCode)
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
|