ViSiToR
Silver Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору AZJIO 18:58 22-01-2011 Цитата: зачем отсылать весь hotkey со всеми символами? | Для удобства. Цитата: Лишнее время на регулярное выражение | Да ну, сколько там времени, это же делается один раз при запуске скрипта. Цитата: Можно сделать функцию для раскладок на любом языке, которая будет возвращать нужный hotkey. В ней два шага, 1.Определить язык, 2.Вернуть букву соответствующую англ. на той же клавише. | Это слишком муторно. Добавлено: Вот, так конвертирует вроде: Код: $sCntrl_a = _HotKeyGetSupported("^a") ConsoleWrite($sCntrl_a & @LF) Func _HotKeyGetSupported($sHotKey) If @KBLayout = 0409 Then Return $sHotKey EndIf Local $ahLocale, $sModifiers, $sKeys, $hWnd, $nEdit = "Edit1", $iOpt_WWD = Opt("WinWaitDelay", 1) $ahLocale = DllCall('user32.dll', 'long', 'LoadKeyboardLayoutW', 'wstr', Hex(@KBLayout, 8), 'uint', 0) If Not @error And $ahLocale[0] Then DllCall('user32.dll', 'none', 'SendMessage', 'hwnd', WinGetHandle(AutoItWinGetTitle()), 'uint', 0x0050, 'uint', 0, 'ptr', $ahLocale[0]) EndIf $sModifiers = StringRegExpReplace($sHotKey, "\A([+!#^]+).*\z", "\1") $sKeys = StringRegExpReplace($sHotKey, "\A[+!#^]+(.*)\z", "\1") Run(@AutoItExe & ' /AutoIt3ExecuteLine "If GUICreate(''_HotKeyConvert_'') And GUICtrlCreateInput('''', 0, 0) And Sleep(1000) Then $i = 1"') $hWnd = WinWait("_HotKeyConvert_", "", 2) Opt("WinWaitDelay", $iOpt_WWD) If Not $hWnd Then Return SetError(1, 0, $sHotKey) EndIf Sleep(10) ControlSend($hWnd, "", $nEdit, $sKeys, 1) Sleep(10) $sKeys = ControlGetText($hWnd, "", $nEdit) Return $sModifiers & $sKeys EndFunc | Добавлено: AZJIO madmasles Нашёл кажется решение. Если процессу AutoIt установить английскую раскладку перед назначением клавиш, то работает при любой раскладке: Код: #include <GUIConstantsEx.au3> #include <GUIEdit.au3> ;THIS IS THE FIX! _WinAPI_LoadKeyboardLayout(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_LoadKeyboardLayout($sLayoutID, $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 |
---------- ViSiToR a.k.a CreatoR CreatoR это не ник, CreatoR это стиль жизни! |
| Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 01:20 23-01-2011 | Исправлено: ViSiToR, 02:47 23-01-2011 |
|