Известно что при использований HotKeySet или GUISetAccelerators, нужно полагаться на текущую раскладку клавиатуры, т.е если мы к примеру задаём
HotKeySet("^!s", "_Func"), то работать оно будет только если перед запуском скрипта раскладка клавиатуры
по умолчанию была английская.
Следующий пример показывает как это можно обойти. Идея в том, чтобы на этапе запуска скрипта, раскладка клавиатуры для нашего приложения поменялась на английскую, тогда у нас не будет проблем, даже если мы переключили раскладку на русскую (или любую другую раскладку), заданные клавиши будут работать в любом случае.
#include <GUIConstantsEx.au3>
#include <GUIEdit.au3>
#include <WinAPIEx.au3>
_FixAccelHotKeyLayout()
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 _FixAccelHotKeyLayout()
Static $iKbrdLayout, $aKbrdLayouts
If Execute('@exitMethod') <> '' Then
Local $iUnLoad = 1
For $i = 1 To Ubound($aKbrdLayouts) - 1
If Hex($iKbrdLayout) = Hex('0x' & StringRight($aKbrdLayouts[$i], 4)) Then
$iUnLoad = 0
ExitLoop
EndIf
Next
If $iUnLoad Then
_WinAPI_UnloadKeyboardLayout($iKbrdLayout)
EndIf
Return
EndIf
$iKbrdLayout = 0x0409
$aKbrdLayouts = _WinAPI_GetKeyboardLayoutList()
_WinAPI_LoadKeyboardLayout($iKbrdLayout, $KLF_ACTIVATE)
OnAutoItExitRegister('_FixAccelHotKeyLayout')
EndFunc