Имя пользователя:
Пароль:
 

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

Аватара для Creat0R

Must AutoIt


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

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


Ещё один способ, на этот раз учитываются используемые в системе раскладки клавиатуры, т.е не нужно теперь указывать языки вручную:

Код: Выделить весь код
#include <Misc.au3>

Global $hUser32_Dll = DllOpen("User32.dll")
Global $nKey = "A1"

;Получаем список используемых в системе раскладок клавиатуры (для циклического переключения)
Global $aLayouts_List = _WinAPI_GetKeyboardLayoutList()

;"Ctrl + Shift + E" для выхода из скрипта
HotKeySet("^+e", "_Exit_Proc")

While 1
    Sleep(10)

    If _IsPressed($nKey, $hUser32_Dll) Then
        While _IsPressed($nKey, $hUser32_Dll)
            Sleep(1)
        WEnd

        _SwitchIt_Proc()
    EndIf
WEnd

Func _SwitchIt_Proc()
    Local $hWnd = WinGetHandle("[ACTIVE]")
    Local $nOld_Layout = _WinAPI_GetKeyboardLayout($hWnd)

    For $i = 1 To $aLayouts_List[0]
        If $aLayouts_List[$i] = $nOld_Layout Then
            $i += 1
            If $i > $aLayouts_List[0] Then $i = 1

            _WinAPI_LoadKeyboardLayout($aLayouts_List[$i], $hWnd)

            ExitLoop
        EndIf
    Next
EndFunc

Func _Exit_Proc()
    Exit
EndFunc

Func _WinAPI_LoadKeyboardLayout($sLayoutID, $hWnd)
    Local $WM_INPUTLANGCHANGEREQUEST = 0x50

    If StringLen($sLayoutID) <= 3 Then $sLayoutID = "00000" & $sLayoutID
    Local $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)

    DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])
EndFunc

Func _WinAPI_GetKeyboardLayout($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 _WinAPI_GetKeyboardLayoutList()
    Local $Ret

    $Ret = DllCall('user32.dll', 'int', 'GetKeyboardLayoutList', 'int', 0, 'ptr', 0)
    If (@error) Or ($Ret[0] = 0) Then
        Return SetError(1, 0, 0)
    EndIf

    Local $tData = DllStructCreate('ptr[' & $Ret[0] & ']')

    $Ret = DllCall('user32.dll', 'int', 'GetKeyboardLayoutList', 'int', $Ret[0], 'ptr', DllStructGetPtr($tData))
    If (@error) Or ($Ret[0] = 0) Then
        Return SetError(1, 0, 0)
    EndIf

    Local $List[$Ret[0] + 1] = [$Ret[0]]

    For $i = 1 To $List[0]
        $List[$i] = Hex(BitAND(DllStructGetData($tData, 1, $i), 0xFFFF))
    Next

    Return $List
EndFunc

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Последний раз редактировалось Creat0R, 13-03-2010 в 19:41. Причина: Поправлен пример

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

Отправлено: 02:25, 13-03-2010 | #3