- Сообщения
 - 8,673
 
- Репутация
 - 2,487
 
Известно что при использований 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
	
	            