1

Тема: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

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

1) как написать условие "Если текущая раскладка - английская, то..."?
Либо как сделать команду вроде
c (в английской раскладке):: ...
То есть хоткей должен работать ТОЛЬКО когда раскладка английская. Или русская. Или еще какая.
Попробовал сделать {U 0067}:: ... - не работает. Так нельзя, да?

2) как задать сочетание клавиш вроде alt + a + b (Alt & a & b не работает)
То есть мне нужно не два и больше контролов-шифтов-альтов, а одна клавиша-модификатор и 2 клавиши обычные.

3) Как заставить скрипт запускаться независимо от текущей раскладки?
(Если в момент запуска была русская раскладка, скрипт завершается с ошибкой)
Либо подавить вывод этой ошибки и продолжить выполнение скрипта (@ не работает)?

2

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

+ Если текущая раскладка - английская, то...
layoutList := {67699721:"en",68748313:"ru"}
if layoutList [ DllCall("GetKeyboardLayout", "UInt", WT) ] = "en"
  msgbox Действие при английской раскладке.
if layoutList [ DllCall("GetKeyboardLayout", "UInt", WT) ] = "ru"
  msgbox Действие при русской раскладке.
+ c (в английской раскладке):: ...
:*:c:: ; что бы нажатая клавиша еще и печатала свой символ то вот так ":B0*:c::"
msgbox Это действие сработает если нажать  именно на английской раскладке.
+ как задать сочетание клавиш вроде alt + a + b
*alt::AltPress := 1
*alt up::AltPress := 0

#if AltPress
:*?:ab::
msgbox alt + a + b
return
#if
+ Как заставить скрипт запускаться независимо от текущей раскладки

Вместо клавиши используй виртуальные коды( вот их таблица кликабельно).
Вот пример

vk41::MsgBox Это буква ф\a Сработает на любой раскладке.

3

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

Спасибо, буду разбираться.

4

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

yalanne, а почему для 2) не использовать простое "a & b::" вместо ":*?:ab::" ? или это намёк на случай, если пользователь захочет ещё больше кнопок в хоткее?

5

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

yalanne, чего-то всё-таки не так с проверкой текущей раскладки:

f1::msgbox % DllCall("GetKeyboardLayout", "UInt", WT)

- вне зависимости от текущей раскладки - всегда выдаёт одно и то же значение (соответствующее "en" раскладке).
w7sp1x64, ahk v1.1.23.03 (проверил на всех вариантах: a32, u32 и u64).

6 (изменено: YMP, 2016-05-30 17:52:22)

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

Да, там малость посложнее. Код для консольного окна нашёл, насколько помню, teadrinker.


F1::
    Layout := GetLayout()
    MsgBox, % Layout = 0x4090409 ? "En" : Layout = 0x4190419 ? "Ru" : "Unknown"
    Return
 
GetLayout()
{
   hWnd := WinExist("A")
   WinGetClass, Class, ahk_id %hWnd%
   if (Class = "ConsoleWindowClass")
   {
      WinGet, PIDConsole, PID, ahk_id %hWnd%
      DllCall("AttachConsole", Ptr, PIDConsole)
      VarSetCapacity(buff, 16)
      DllCall("GetConsoleKeyboardLayoutName", Ptr, &buff)
      DllCall("FreeConsole")
      Return StrGet(&buff)
   }
   else
   {
      ThreadID := DllCall("GetWindowThreadProcessId", Ptr, hWnd, UInt, 0, Ptr)
      InputLocaleID := DllCall("GetKeyboardLayout", Ptr, ThreadID, Ptr)
      Return InputLocaleID
   }
}

7

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

langID := DllCall("GetKeyboardLayout", Ptr, DllCall("GetWindowThreadProcessId", Ptr, WinExist("A"), UInt, 0, Ptr), Ptr) & 0xFFFF
MsgBox, % langID = 0x409 ? "En" : "Ru"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8 (изменено: teadrinker, 2016-05-30 17:56:23)

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

YMP пишет:

Layout = 0x4190419

Русская раскладка не всегда 0x4190419 (как, наверно, и английская не всегда 0x4090409). Здесь нужно ориентироваться на первые два байта — low word.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

teadrinker
Ну, тогда это не раскладка, а язык. В коде у тебя более корректно это названо.

10

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

Для всех окон (включая консольное):

F11:: MsgBox % GetInputLangName(GetInputLangID("A"))
 
GetInputLangID(window)
{
	If !(hWnd := WinExist(window))
		return

	WinGetClass, Class

	if (Class == "ConsoleWindowClass")
	{
		WinGet, consolePID, PID
		DllCall("AttachConsole", Ptr, consolePID)
		VarSetCapacity(buff, 16)
		DllCall("GetConsoleKeyboardLayoutName", Str, buff)
		DllCall("FreeConsole")
		langID := "0x" . SubStr(buff, -3)
	}
	Else
		langID := DllCall("GetKeyboardLayout", Ptr, DllCall("GetWindowThreadProcessId", Ptr, hWnd, UInt, 0, Ptr), Ptr) & 0xFFFF

	return langID
}
 
GetInputLangName(langId)
{
	Size := (DllCall("GetLocaleInfo", UInt, langId, UInt, 0x1001, UInt, 0, UInt, 0) * 2)   ; LOCALE_SENGLANGUAGE := 0x1001
	VarSetCapacity(localeSig, Size, 0)
	DllCall("GetLocaleInfo", UInt, langId, UInt, 0x1001, Str, localeSig, UInt, Size)
	return localeSig
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

YMP пишет:

teadrinker
Ну, тогда это не раскладка, а язык.

Ну да, раскладок-то всяких много может быть, всех не учтёшь.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

В принципе, может, и много, но на практике одна. Ну зачем тебе, к примеру, раскладка Дворжака на английском? Или на русском какая-нибудь "Машинопись"?

13

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

У меня как раз в связи с этой проблемой две русских. Использую модифицированную, но старую не удалил на всякий случай.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

Понятно. Кстати, у языков ведь тоже есть разновидности. 0x409 — это не просто En, а En-US. 0x419 — это Ru-Ru. Есть ещё, оказывается, 0x819, русский в Молдавии. Так что верхнюю часть младшего слова тоже нужно отрезать.

15

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

Да, судя по всему, последнего байта достаточно, так что:

PrimLangID := DllCall("GetKeyboardLayout", Ptr, DllCall("GetWindowThreadProcessId", Ptr, WinExist("A"), UInt, 0, Ptr), Ptr) & 0xFF
MsgBox, % PrimLangID = 0x09 ? "En" : "Ru"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

Точнее, первые 10 битов.


+-------------------------+-------------------------+
|     SubLanguage ID      |   Primary Language ID   |
+-------------------------+-------------------------+
15                    10  9                         0   bit

17

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

Почему десять-то? Вот таблица.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

По документации Майкрософта: Language Indentifiers.

19

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

Вижу там, что SubLanguage ID начинается от 9 бита.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

Просто рисунок слегка двусмысленный. Вот смотри.


SetFormat, Integer, Hex
Lang = 9
SubLang = 1
MsgBox, % SubLang << 10 | Lang

21

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

А, да, теперь верю. Значит, правильно так:

PrimLangID := DllCall("GetKeyboardLayout", Ptr, DllCall("GetWindowThreadProcessId", Ptr, WinExist("A"), UInt, 0, Ptr), Ptr) & 0x3FF
MsgBox, % PrimLangID = 0x09 ? "En" : "Ru"

Но практически предыдущий вариант с 0xFF тоже подойдёт.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

22

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

Сегодня подойдёт, а завтра? Поэтому и рекомендуется избегать таких решений.

23

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

PrimLangID у русского и английского завтра не изменится, а они оба в пределах 0xFF.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24 (изменено: YMP, 2016-06-04 19:31:35)

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

А вдруг твой код к какому-нибудь мумба-юмба попадёт? Чем он виноват-то? Да и полезно (на всякий случай) знать, где должен находиться sublanguage ID. Где гарантия, что завтра это тебе или кому ещё не понадобится? А твой код с 0x3FF будет на это прозрачно намекать.

25

Re: AHK: раскладкозависимость, подавление ошибок, хоткей вида ctrl-a-b

Ок!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder