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

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

Аватара для beve

Старожил


Сообщения: 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

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


Последний раз редактировалось beve, 23-08-2009 в 17:16.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:57, 23-08-2009 | #9