Что нового

изменение раскладки в GUI

saraconor

Чайник
Сообщения
349
Репутация
2
Код:
#include <GuiConstantsEx.au3>

$Form1 = GUICreate('test', 200, 100, 500, 500)
GUISetState(@SW_SHOW)
$BTN_1 = GUICtrlCreateInput('', 20, 20, 60, 20)
$BTN_2 = GUICtrlCreateInput('', 120, 20, 60, 20)

While 1
$msg = GUIGetMsg()
Switch $msg
    Case $GUI_EVENT_CLOSE
     ExitLoop
    Case $BTN_1
        _SetKeyboardLayout("00000419", WinGetHandle(AutoItWinGetTitle()))
    case $BTN_2
        _SetKeyboardLayout("00000409", WinGetHandle(AutoItWinGetTitle()))
EndSwitch
wend

Func _SetKeyboardLayout($sLayoutID, $hWnd)
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", 0x50, "int", 1, "int", $ret[0])
EndFunc


Как убрать задержку при переключении раскладки? К примеру в GUI переходя из одного поля ввода в другое ставится условие чтобы в следующем поле раскладка менялась, но из за того что есть задрежка начало текста получается со старой раскладкой.



В общем получается пример ниже это единственный выход?
Код:
#include <GuiConstantsEx.au3>
#include <WinAPIEx.au3>				;альтернативное нажатие клавиш

$Form1 = GUICreate('test', 230, 70, 500, 500)
$BTN_1 = GUICtrlCreateInput('', 20, 20, 90, 20)
$BTN_2 = GUICtrlCreateInput('', 120, 20, 90, 20)
GUISetState(@SW_SHOW)
_SetKeyboardLayout("00000409", WinGetHandle(AutoItWinGetTitle()))

While 1
$msg = GUIGetMsg()
Switch $msg
    Case $GUI_EVENT_CLOSE
     ExitLoop
	Case $BTN_1
		_WinAPI_Keybd_Event(0x12, 0)	;Alt
		_WinAPI_Keybd_Event(0x10, 0)	;Shift
		_WinAPI_Keybd_Event(0x10, 2)	;Shift
		_WinAPI_Keybd_Event(0x12, 2)	;Alt
    case $BTN_2
		_WinAPI_Keybd_Event(0x12, 0)	;Alt
		_WinAPI_Keybd_Event(0x10, 0)	;Shift
		_WinAPI_Keybd_Event(0x10, 2)	;Shift
		_WinAPI_Keybd_Event(0x12, 2)	;Alt
EndSwitch
wend

Func _SetKeyboardLayout($sLayoutID, $hWnd)
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", 0x50, "int", 1, "int", $ret[0])
EndFunc
 

xXx

Меценат
Меценат
Сообщения
91
Репутация
27
Код:
#include <GuiConstantsEx.au3>
#include <WinAPISys.au3>

Local $hControlPrev

$Form1 = GUICreate('test', 200, 100)
$BTN_1 = GUICtrlCreateInput('', 20, 20, 60, 20)
$hBTN_1 = GUICtrlGetHandle($BTN_1)
$BTN_2 = GUICtrlCreateInput('', 120, 20, 60, 20)
$hBTN_2 = GUICtrlGetHandle($BTN_2)
GUISetState(@SW_SHOW)

;~ _WinAPI_LoadKeyboardLayout(0x0409, $KLF_ACTIVATE)
;~ _WinAPI_LoadKeyboardLayout(0x0419, $KLF_ACTIVATE)

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			ExitLoop
	EndSwitch
	Switch ControlGetHandle($Form1, '', '')
		Case $hBTN_1
			If $hControlPrev <> $hBTN_1 Then
				_WinAPI_SetKeyboardLayout($hBTN_1, 0x0419)
				$hControlPrev = $hBTN_1
			EndIf
		Case $hBTN_2
			If $hControlPrev <> $hBTN_2 Then
				_WinAPI_SetKeyboardLayout($hBTN_2, 0x0409)
				$hControlPrev = $hBTN_2
			EndIf
	EndSwitch
WEnd



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

saraconor сказал(а):
В общем получается пример ниже это единственный выход?
Если вам никто не отвечает это не значит что нет решения. ;)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 159
Репутация
2 329
Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPISys.au3>

Global Enum $iGCISKL_ID, $iGCISKL_Handle, $iGCISKL_KL, _
	$iGCISKL_Total
Global $aGCISKL_Arr[1][$iGCISKL_Total]

$hGUI = GUICreate('_GUICtrlInput_SetKeyboardLayout Example', 200, 70)

$iInput1 = GUICtrlCreateInput('', 20, 20, 60, 20)
_GUICtrlInput_SetKeyboardLayout($iInput1, 0x0409)

$iInput2 = GUICtrlCreateInput('', 120, 20, 60, 20)
_GUICtrlInput_SetKeyboardLayout($iInput2, 0x0419)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
	EndSwitch
WEnd

Func _GUICtrlInput_SetKeyboardLayout($iID, $nKL)
	For $i = 1 To $aGCISKL_Arr[0][0]
		If $aGCISKL_Arr[$i][$iGCISKL_ID] = $iID Then
			$aGCISKL_Arr[$i][$iGCISKL_ID] = $nKL
			Return 1
		EndIf
	Next
	
	If $aGCISKL_Arr[0][0] = 0 Then
		GUIRegisterMsg($WM_COMMAND, '__GCISKL_WM_COMMAND')
	EndIf
	
	$aGCISKL_Arr[0][0] += 1
	ReDim $aGCISKL_Arr[$aGCISKL_Arr[0][0] + 1][$iGCISKL_Total]
	
	$aGCISKL_Arr[$aGCISKL_Arr[0][0]][$iGCISKL_ID] = $iID
	$aGCISKL_Arr[$aGCISKL_Arr[0][0]][$iGCISKL_Handle] = GUICtrlGetHandle($iID)
	$aGCISKL_Arr[$aGCISKL_Arr[0][0]][$iGCISKL_KL] = $nKL
	
	Return 1
EndFunc

Func __GCISKL_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = BitAND($wParam, 0xFFFF)
	
	Switch $nNotifyCode
		Case $EN_SETFOCUS
			For $i = 1 To $aGCISKL_Arr[0][0]
				If $aGCISKL_Arr[$i][$iGCISKL_ID] = $nID Then
					_WinAPI_SetKeyboardLayout($aGCISKL_Arr[$i][$iGCISKL_Handle], $aGCISKL_Arr[$i][$iGCISKL_KL])
					Return $GUI_RUNDEFMSG
				EndIf
			Next
	EndSwitch
	
	Return $GUI_RUNDEFMSG
EndFunc


Работает также и с Edit.
 
Автор
S

saraconor

Чайник
Сообщения
349
Репутация
2
Выложите пожалуйста библиотеку WinAPISys.au3
Хотя нет, видимо новая версия нужна.
Сообщение автоматически объединено:

В вашем приемере есть небольшая задержка, Если имитировать нажатие Alt+Shift - задержки нет вообще.
 
Последнее редактирование:
Верх