Что нового

Как быстро поменять раскладку (RU/ENG) на заданную?

Suppir

Продвинутый
Сообщения
967
Репутация
62
Вариант послания Alt+Shift отпадает, потому что у разных пользователей стоят различные комбинации клавиш. Манипуляции в трее также отпадают, так как у некоторых пользователей есть меню в трее, у других - нет, а у третьих стоит PuntoSwitcher и подобные штуки.
Существует ли функция, которая меняет раскладку на заданную напрямую? Спасибо
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
поменять раскладку можно только в определённом окне, $WorkWindowName - название окна
Код:
$WinID=WinGetHandle($WorkWindowName)
$ret=DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", "00000409", "int", 0)
DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $WinID, "int", "0x50", "int", 1, "int", $ret[0])

00000409 - Eng
00000419 - Rus
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Осталось только узнать, как получить этот $WorkWindowName. У меня в программе название окна (верхняя синяя полоска программы) меняется в зависимости от того, какой документ открыт.
Как получить название активного окна?
 

SyDr

Сидра
Сообщения
651
Репутация
158
"" - вот название активного окна :smile:
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
можно использовать [CLASS:класс окна] и\или текст в окне
так WinGetHandle("[CLASS:TTOTAL_CMD]") или так WinGetHandle("", "а тут какой-нить текст из окна")
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Еще вопросик. У меня в буфере обмена есть текст. Я хочу вставить его в форму. Активный курсор мигает внутри формы, раскладка английская. Я посылаю

Код:
Send ("^v")


(вставить), однако вставка текста работает в 1 случае из 10. В чем тут может быть дело?
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
лучше использовать ControlSend ( а тут можно указать хендел, "text", controlID, "string" [, flag] )
или можно ControlSetText ( "title", "text", controlID, "new text" [, flag] )
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
по вопросу об активном окне
Код:
$hwnd = WinGetHandle('[ACTIVE]')

Но тут надо быть аккуратнее, т.к. это действительно хендл именно активного окна, и не всегда это то окно которое нужно ;D

Suppir [?]
однако вставка текста работает в 1 случае из 10
Send, так же как и ControlSend - это имитация нажатия клавиш. А уж когда нажимать, это как говорится лотерея. Нажмется как только интерпретатор начнет обрабатывать именно эту строку.
Поэтому, если так сильно хочется использовать именно Send, то лучше выставить
Код:
Opt("SendKeyDelay",...)
нужное время...
Но самое надежное, как уже прозвучало в теме, это
Код:
ControlSetText()
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
а где можно посмотреть все параметры которые можно указывать в квадратных скобках, такие как [ACTIVE]?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Vovsla
Help - Window Titles and Text (Advanced)
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Ух, перед празниками такая запарка с работой - не остается времени на AutoIt :(

В общем, я пробую использовать ControlSend

Код:
Global $Topic = "23968526"
Global $TopicName = "О проведении краевой научно-практической конференции ""Организация медицинской помощи в Краснодарском крае при чрезвычайных ситуациях"
Global $Source = "департамента здравоохранения Краснодарского края"
Global $Type = "Приказ"
Global $Date = "15 декабря 2009 г."
Global $Code = "3241"
Global $Shapka = $Type & " " & $Source & " " & "от " & $Date & " N " & $Code & " """ & $TopicName & """"
ClipPut($Shapka)
sleep (100)
ControlSend("Новый документ", "", "", $Shapka)


При этом у меня вывелось:

Приказ департамента здравоохранения Краснодарского кра от 15 декабря 2009 гю Т 3241 ЭО проведении краевой научно-практической конференции ЭОрганизация медицинской помощи в Краснодарском крае при чрезвычайных ситуацияхЭ

Т.е. кавычки заменились на "Э", точка заменилась на "ю". Я так понимаю, что опять проблема в раскладке.


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

А если использовать ControlSetText, то символы интерпретируются нормально!
 

asdf8

Скриптер
Сообщения
564
Репутация
152
У меня вопрос: как скрипту поменять раскладку своему окну?

Код:
#include <GUIConstantsEx.au3>

$Form1 = GUICreate("Form1", 633, 447, 192, 124)
$Edit1 = GUICtrlCreateEdit("", 8, 12, 613, 357)
GUICtrlSetData(-1, "Edit1")
GUISetState(@SW_SHOW)

Sleep(400)
$WinID=WinGetHandle($Form1)
$ret=DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", "00000409", "int", 0)
DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $WinID, "int", "0x50", "int", 1, "int", $ret[0])
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd


Если раскладка русская, то после запуска она так и остается русской.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
asdf8 [?]
Если раскладка русская, то после запуска она так и остается русской.
Менять раскладку нужно у Edit-элемента:

Код:
#include <GUIConstantsEx.au3>

$Form1 = GUICreate("Form1", 633, 447, 192, 124)
$Edit1 = GUICtrlCreateEdit("", 8, 12, 613, 357)
GUICtrlSetData(-1, "Edit1")
GUISetState(@SW_SHOW)

$aRet = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", "00000409", "int", 0)
DllCall("user32.dll", "ptr", "SendMessage", "hwnd", GUICtrlGetHandle($Edit1), "int", "0x50", "int", 1, "int", $aRet[0])

While 1
    $nMsg = GUIGetMsg()
	
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Друзья, забудьте уже про DllCall(), есть ведь WinAPIEx.au3. В большинстве случаев это намного проще и быстрее.

Код:
#include <GUIConstantsEx.au3>
#include <WinAPIEx.au3>

$Form1 = GUICreate("Form1", 633, 447, 192, 124)
$Edit1 = GUICtrlCreateEdit("", 8, 12, 613, 357)
GUICtrlSetData(-1, "Edit1")
GUISetState(@SW_SHOW)

_WinAPI_SetKeyboardLayout(GUICtrlGetHandle($Edit1), 0x0409)

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd


:whistle:

OffTopic:
Надеюсь когда-нибудь эту библиотеку объединят с WinAPI.au3, которая входит в состав AutoIt.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Yashied [?]
Надеюсь когда-нибудь эту библиотеку объединят с WinAPI.au3, которая входит в состав AutoIt.
Надеяться не вредно, но чтобы это произошло нужно её преподнисти разработчикам, и причём со всеми запчастями, включая доки к каждой функций (подробнее).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
OffTopic:
Я это уже делал - #1158.

:smile:
 
Верх