Что нового

Использование @KBLayout в скрипте

Suppir

Продвинутый
Сообщения
967
Репутация
62
Я проверял только в XP. Написал скрипт, где были условия вроде:

Код:
If @KBLayout = 0419 Then Send ("!т")
If @KBLayout = 0409 Then Send ("!n")


и потом долго думал, почему у меня при работе скрипта лишние символы печатаются и интерфейс программ залипает.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Suppir сказал(а):
Написал скрипт, где были условия...

Редкий случай, так как обычно в собственную программу Send'ом ничего не посылают.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Нет, скрипт соединял две большие программы :smile: Вроде баз данных с интерфейсами. В одной программе (А), доступной всем пользователям, была только небольшая часть документов. А в другой программе (Б) были все документы, но запрещена их обработка.

Когда пользователь кликал по ссылке в программе А, у него в 90% случаев выскакивала ошибка - нет такого документа. Ему приходилось открывать программу Б и искать этот документ. А мой скрипт автоматически закрывал выскакивающую ошибку и моментально открывал этот документ в программе Б (+ еще несколько функций для автоматизации). Всего 6 kb кода, но пришлось повозиться с кучей исключений. В принципе, AutoIt очень подходит для таких задач :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Тогда @KBLayout тут нипричем. Технически, этот макрос возвращает раскладку для скрытого окна AutoIt (и как следствие, для всех окон, созданных при помощи GUICreate()), а не для сторонних окон.

:blink:
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Попробуй код:

MsgBox(0, "", @KBLayout)

Он возвращает язык ввода по умолчанию. Если стоит русский, то 0000419, если английский, то 0000409.

Если мы имеем язык ввода по умолчанию английский, то многим программам нельзя посылать русские хоткеи - они не распознаются. И наоборот. А т.к. у разных пользователей разный язык по умолчанию, то приходится посылать два варианта хоткеев, в зависимости от возвращаемого значения @KBLayout.




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

Сначала я посылал только английские хоткеи, вроде Send("^n"). Но у половины пользователей скрипт не работал. Оказалось, что тем из них, у которых стоит русская раскладка по умолчанию, нужно было посылать Send("^т").
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Suppir сказал(а):
У меня скрипт без GUI. Только меню в трее.

  • Любая программа в Windows имеет окно (хотя бы одно и скрытое), в противном случае, это консольная программа.
  • С помощью @KBLayout ты можешь контролировать раскладку только для своих собственных окон, созданных с помощью GUICreate(). Если ты не создавал окна, то польза от @KBLayout равна 0, он всегда будет возвращать значение дефолтной раскладки.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Да.

Мне и нужен код дефолтного языка, чтобы использовать в Send'ах.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Suppir сказал(а):
...т.к. у разных пользователей разный язык по умолчанию, то приходится посылать два варианта хоткеев, в зависимости от возвращаемого значения @KBLayout.

А что, если пользователь переключил раскладку, как тебе поможет @KBLayout?
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Yashied сказал(а):
А что, если пользователь переключил раскладку, как тебе поможет @KBLayout?

Сначала я думал, что хоткеи посылаются (Send, ControlSend) неверно из-за того, что сейчас стоит другая раскладка. Пробовал менять раскладку, но это не принесло результатов. Но оказалось, что нужно посылать хоткеи именно в зависимости от раскладки по умолчанию. Если по умолчанию стоит английская, а сейчас активна русская, то нужно посылать английские хоткеи. Если стоит по умолчанию русская, а активная английская - то посылать русские. Вот такие тонкости.
 

sss

Продвинутый
Сообщения
332
Репутация
96
А можно ли как-нибудь определить какая раскладка сейчас, а не умолчанию?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Sky-WaLkeR сказал(а):
А можно ли как-нибудь определить какая раскладка сейчас, а не умолчанию?

Для окон AutoIt (своей собственной программы) - @KBLayout.

Код:
$Prev = 0

GUICreate('MyGUI', 400, 400)
GUICtrlCreateInput('', 10, 10, 100, 19)
$Label = GUICtrlCreateLabel('', 10, 36, 100, 14)
GUISetState()

Do
	If $Prev <> @KBLayout Then
		$Prev = @KBLayout
		GUICtrlSetData($Label, $Prev)
	EndIf
Until GUIGetMsg() = -3
 

sss

Продвинутый
Сообщения
332
Репутация
96
Надо для окон винды, то, что отображается в языковой панели. Окна видимого от автоита нету.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Sky-WaLkeR сказал(а):
Надо для окон винды, то, что отображается в языковой панели.

Код:
#Include <WinAPIEx.au3>

Global $Prev = 0

While 1
	$Lang = _WinAPI_GetKeyboardLayout(WinGetHandle('[ACTIVE]'))
	If $Lang <> $Prev Then
		TrayTip('', 'Keyboard: 0x' & Hex($Lang), 30)
		$Prev = $Lang
	EndIf
	Sleep(100)
WEnd
 

sss

Продвинутый
Сообщения
332
Репутация
96
Спасибо, получилось!
 
Верх