Что нового

Не воспринимает раскладку клавиатуры на другом компьютере.

shift72

Новичок
Сообщения
86
Репутация
2
Проблема такая мой скрипт работает с горячими коавишами. Контрол + Ф.
Код:
Send("^f"); нажимаешь контрол ф

На моем компьютере прекрасно работает. Но на компьютере друга нет. Дело оказалось в раскладке клавиатуры. У меня по умолчанию стоит Английская, а у него Русская. Тогда я использовал команду
Код:
$hLayout_Wnd = WinGetHandle("[Active]") 
  
 _SetKeyboardLayout(409, $hLayout_Wnd) 
  
Func _SetKeyboardLayout($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


Раскладка меняется но горячии клавиши не срабатывают.
Сработать должны в браузере Опера.
Если я пишу программу так
Код:
Send("^а"); нажимаешь контрол ф

Вместо английской F русскую А то у него все отлично работает, у меня нет.
В чем проблема не пойму.....
 
Автор
S

shift72

Новичок
Сообщения
86
Репутация
2
Написано что эта команда
Код:
_WinAPI_LoadKeyboardLayoutEx(0x0409)
переходит на английскую раскладку, но у меня с ней ошибка
_WinAPI_LoadKeyboardLayoutEx(0x0409)
^ ERROR
 
Автор
S

shift72

Новичок
Сообщения
86
Репутация
2
Можно код функции отдельно, без окошка этого?...
 
Автор
S

shift72

Новичок
Сообщения
86
Репутация
2
Код:
#include <GUIConstantsEx.au3>
#include <GUIEdit.au3>

;Вот эта строчка задаёт английскую раскладку клавиатуры для нашего приложения
_WinAPI_LoadKeyboardLayoutEx(0x0409)

HotKeySet("^+e", "_Quit")

$hGUI = GUICreate("Fix for hotkey/Accelerators assign problem", 300, 200)
$nEdit = GUICtrlCreateEdit("", 20, 40, 260, 120)

$nDummy = GUICtrlCreateDummy()
Dim $aAccelKeys[1][2] = [["^a", $nDummy]]
GUISetAccelerators($aAccelKeys)

GUISetState(@SW_SHOW, $hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nDummy
            _GUICtrlEdit_SetSel($nEdit, 0, -1)
    EndSwitch
WEnd

Func _Quit()
    Exit
EndFunc

Func _WinAPI_LoadKeyboardLayoutEx($sLayoutID = 0x0409, $hWnd = 0)
    Local Const $WM_INPUTLANGCHANGEREQUEST = 0x50
    Local $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayoutW", "wstr", Hex($sLayoutID, 8), "int", 0)
    
    If Not @error And $aRet[0] Then
        If $hWnd = 0 Then
            $hWnd = WinGetHandle(AutoItWinGetTitle())
        EndIf
        
        DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])
        Return 1
    EndIf
    
    Return SetError(1)
EndFunc

Если все это вставить то вылазит какое то окно. Я немогу извлеч функцию отсюда т.к. не шарю совсем (пака что). С ней я разберусь позже но сейчас занят немного другим, и нужно быстро решить проблему.


Добавлено:
Сообщение автоматически объединено:

madmasles обьясни пожалуйста как вытащить скрипт отсюда...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
shift72 [?]
Если все это вставить то вылазит какое то окно
Функция начинается с «Func...». Об этом указано в справке.

Код:
;Задаём раскладку для нашего приложения
_WinAPI_LoadKeyboardLayoutEx(0x0409, 0)

;Тут код выполнения скрипта

Func _WinAPI_LoadKeyboardLayoutEx($sLayoutID = 0x0409, $hWnd = 0)
    Local Const $WM_INPUTLANGCHANGEREQUEST = 0x50
    Local $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayoutW", "wstr", Hex($sLayoutID, 8), "int", 0)
    
    If Not @error And $aRet[0] Then
        If $hWnd = 0 Then
            $hWnd = WinGetHandle(AutoItWinGetTitle())
        EndIf
        
        DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])
        Return 1
    EndIf
    
    Return SetError(1)
EndFunc
 
Автор
S

shift72

Новичок
Сообщения
86
Репутация
2
Не помогает. Раскладка меняется, но ведь приложение работает с браузером, а данный скрипт как я понял меняет раскладку только в приложении. Как сделать чтоб сменил раскладку везде затем сделал как было?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
shift72 [?]
нужно быстро решить проблему
Попробуйте отправить подряд оба варианта:
Код:
Send("^f")
Send("^а")
Один из вариантов сработает у вас, другой - у него. Неверный вариант не сработает.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
shift72 [?]
приложение работает с браузером, а данный скрипт как я понял меняет раскладку только в приложении
Так а что мешает указать окно браузера?

Код:
$hBrowser = WinGetHandle('[CLASS:OperaWindowClass;REGEXPTITLE:^.*? - Opera.*$]')
_WinAPI_LoadKeyboardLayoutEx(0x0409, $hBrowser)
 
Автор
S

shift72

Новичок
Сообщения
86
Репутация
2
Попробуйте отправить подряд оба варианта
Я так и сделал. Но это не кашерно. И малали может быть понадобится в будущем. Так что с проблемой нужно разобраться
 
Верх