Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


Спасибо, за идею. Вот, сделал то что было непонятно (а то в приведенном выше примере "не работали" некоторые клавиши-ю,х,ъ...):
Код: Выделить весь код
#include <Misc.au3>

HotKeySet("{ESC}", "OnAutoItExit")


Global Const $WH_KEYBOARD_LL = 13
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(30)
WEnd

Func EvaluateKey($nKeyCode)
Local $captureCodes, $engWithShiftCodes, $engCodes, $rusWithShiftCodes,$rusCodes, $ukrWithShiftCodes, $ukrCodes, $i 

Switch $nKeyCode
Case 65 To 90, 48 To 57,186,188,190,191,192,219,221,222 ; проверяться будут только нажатия на буквы и цифры
    If StringLen($nKeyCode)<3 Then $nKeyCode="0"&$nKeyCode
    Switch _WinGetKeyboardLayout(WinGetHandle("[ACTIVE]"))
    ;Если раскладка английская
    Case 0409
    If _IsPressed(10) Then ; если нажата клавиша Shift
    $captureCodes = StringSplit("192,081,087,069,082,084,089,085,073,079,080,219,221,065,083,068,070,071,072,074,075,076,186,222,090,088,067,086,066,078,077,188,190,191,048,049,050,051,052,053,054,055,056,057", ",")
     $engWithShiftCodes = StringSplit("126,081,087,069,082,084,089,085,073,079,080,123,125,065,83,068,070,071,072,074,075,076,058,034,090,088,067,086,066,078,077,060,062,063,041,033,064,035,036,037,094,038,042,040", ",")
        For $i = 1 To $captureCodes [0]
            $nKeyCode = StringReplace($nKeyCode,$captureCodes [$i], $engWithShiftCodes[$i])
        Next
    ToolTip(Chr($nKeyCode)& " - "&$nKeyCode, 0, 80)
    SoundPlay("en.wav") ;проигрывать звук при нажатии
Else ; если не нажата клавиша Shift
    $captureCodes = StringSplit("192,081,087,069,082,084,089,085,073,079,080,219,221,065,083,068,070,071,072,074,075,076,186,222,090,088,067,086,066,078,077,188,190,191,048,049,050,051,052,053,054,055,056,057", ",")
    $engCodes = StringSplit("096,113,119,101,114,116,121,117,105,111,112,091,093,097,115,100,102,103,104,106,107,108,059,039,122,120,099,118,098,110,109,044,046,047,048,049,050,051,052,053,054,055,056,057", ",")
        For $i = 1 To $captureCodes [0]
            $nKeyCode = StringReplace($nKeyCode,$captureCodes [$i], $engCodes[$i])
        Next
    ToolTip(Chr($nKeyCode)& " - "&$nKeyCode, 0, 80)
     SoundPlay("en.wav") ;проигрывать звук при нажатии
    EndIf

    ;Если расскладка русская
    Case 0419
    If _IsPressed(10) Then  ; если нажата клавиша Shift
    $captureCodes = StringSplit("192,081,087,069,082,084,089,085,073,079,080,219,221,065,083,068,070,071,072,074,075,076,186,222,090,088,067,086,066,078,077,188,190,191,048,049,050,051,052,053,054,055,056,057", ",")
     $rusWithShiftCodes = StringSplit("168,201,214,211,202,197,205,195,216,217,199,213,218,212,219,194,192,207,208,206,203,196,198,221,223,215,209,204,200,210,220,193,222,044,041,033,034,185,059,037,058,063,042,040", ",")
        For $i = 1 To $captureCodes [0]
            $nKeyCode = StringReplace($nKeyCode,$captureCodes [$i], $rusWithShiftCodes[$i])
        Next
    ToolTip(Chr($nKeyCode)& " - "&$nKeyCode, 0, 80)
    SoundPlay("ru.wav") ;проигрывать звук при нажатии
Else  ; если не нажата клавиша Shift
    $captureCodes = StringSplit("192,081,087,069,082,084,089,085,073,079,080,219,221,065,083,068,070,071,072,074,075,076,186,222,090,088,067,086,066,078,077,188,190,191,048,049,050,051,052,053,054,055,056,057", ",")
    $rusCodes = StringSplit("184,233,246,243,234,229,237,227,248,249,231,245,250,244,251,226,224,239,240,238,235,228,230,253,255,247,241,236,232,242,252,225,254,046,048,049,050,051,052,053,054,055,056,057", ",")
        For $i = 1 To $captureCodes [0]
            $nKeyCode = StringReplace($nKeyCode,$captureCodes [$i], $rusCodes[$i])
       Next
    ToolTip(Chr($nKeyCode)& " - "&$nKeyCode, 0, 80)
    SoundPlay("ru.wav") ;проигрывать звук при нажатии
    EndIf   

    ;если расскладка украинская
Case 0422
    If _IsPressed(10) Then ; если нажата клавиша Shift
    $captureCodes = StringSplit("192,081,087,069,082,084,090,085,073,079,080,219,221,065,083,068,070,071,072,074,075,076,186,222,089,088,067,086,066,078,077,188,190,191,048,049,050,051,052,053,054,055,056,057", ",")
     $ukrWithShiftCodes = StringSplit("146,201,214,211,202,197,205,195,216,217,199,213,175,212,178,194,192,207,208,206,203,196,198,170,223,215,209,204,200,210,220,193,222,044,041,033,034,185,059,037,058,063,042,040", ",")
        For $i = 1 To $captureCodes [0]
            $nKeyCode = StringReplace($nKeyCode,$captureCodes [$i], $ukrWithShiftCodes[$i])
        Next
    ToolTip(Chr($nKeyCode)& " - "&$nKeyCode, 0, 80)
    SoundPlay("ukr.wav") ;проигрывать звук при нажатии
    Else ; если не нажата клавиша Shift
    $captureCodes = StringSplit("191,192,081,087,069,082,084,090,085,073,079,080,219,221,065,083,068,070,071,072,074,075,076,186,222,089,088,067,086,066,078,077,188,190,048,049,050,051,052,053,054,055,056,057", ",")
    $ukrCodes = StringSplit("046,039,233,246,243,234,229,237,227,248,249,231,245,191,244,179,226,224,239,240,238,235,228,230,186,255,247,241,236,232,242,252,225,254,048,049,050,051,052,053,054,055,056,057", ",")
        For $i= 1 To $captureCodes [0]
            $nKeyCode = StringReplace($nKeyCode, $captureCodes [$i], $ukrCodes[$i])
        Next
    ToolTip(Chr($nKeyCode)& " - "&$nKeyCode, 0, 80)
    SoundPlay("ukr.wav") ;проигрывать звук при нажатии
    EndIf

    EndSwitch
Case Else ; если была нажата не буква и не цыфра, то выход из функции
    Return
EndSwitch
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 _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

-------
Не в кількості знань полягає освіта, а в повному розумінні і вмілому використанні того, що знаєш.


Отправлено: 19:46, 22-08-2009 | #5