1

Тема: AHK: Win+1 в Ctrl+1 – раскладка клавиатуры мешает

Приветствую почтенных форумчан в очередной раз!

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

Прознал я, что помимо привычного Alt+Tab существует более точный прием вызова необходимого окна из тех, что присутствуют запущенными на Панели задач, а именно Win+1/2/3 и т. д. (Там с оговорками, в зависимости от закрепленных приложений справа от Пуска, но не об этом сейчас.) Сама идея хорошая, вот только указанные кнопки моей левой клешне не очень подходят, я бы предпочел вместо сочетания Win+1 заиметь Ctrl+1 (и далее по списку, конечно). Да, это зарубит переключение между вкладками в Microsoft Edge, ну и ладно бы, можно пережить (или переназначить опять же).

Довольно быстро по нубским своим меркам создал следующий скрипт:

<^1::SendInput #1
<^2::SendInput #2
<^3::SendInput #3
<^4::SendInput #4
<^5::SendInput #5
<^6::SendInput #6
<^7::SendInput #7
<^8::SendInput #8
<^9::SendInput #9

(Просто Send почему-то сбоил периодически, но я уже довольно давно уяснил, что SendInput понадежней будет.)

Но вот незадача: это переназначение выполняется только на английской раскладке или на обычной русской раскладке (RU). А у меня стоит Русская Машинопись (обозначается RUT по крайней мере в моей Windows 10 64 Pro). На всякий случай сообщаю, в чем суть раскладки: в ней за всем цифровым рядом закреплены всякие знаки (конкретно №-/":,._?% в последовательности от 1 до 0), а чтобы получить цифру, нужно прожать Shift+цифра. Видимо, в этом и заключается проблема: нажимая в машинописной раскладке клавишу "1", я без каких бы то ни было скриптов получаю "№", а не "1", соответственно, сочетание Ctrl+1 в вышеприведенном коде уже не прокатывает.

Конечно, я попробовал переиначить код и протестировал строчку вида:

<^№::SendInput #1

но как-то она не дала искомого результата.

Затем я пораскинул скудным своим программистским интеллектом и вспомнил про SCnnn/VKnn. То есть, по идее, нужно сделать так, чтобы именно код физической клавиши срабатывал, а не тот символ, который за этой клавишей закреплен в той или иной раскладке... Так я отправился на поиски скан-кодов клавиш цифрового ряда и как бы нашел их, например, вот здесь: http://www.quadibloc.com/comp/scan.htm

Ну и подставил оттуда код, получил строчку вида:

<^SC02::SendInput #1

...и она не сработала. (Позднее я вроде понял, что и не могла она сработать, потому что SC в AHK содержит три символа, а не два... Пока что это осталось потемками для меня, оставим.)

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

#InstallKeybdHook
KeyHistory

получил выкладку SC и VK для моей клавиатуры, использовал

<^SC002::SendInput #1

и

<^VK31::SendInput #1

...и опять же ни к чему не пришел позитивному.



...Подскажите, пожалуйста, можно ли как-то обойти этот тупик? (Видят небеса, этот ламер сделал все что мог, чтобы не обращаться на сей форум и не беспокоить летнюю, может быть, даже еще отпускную общественность, но никак не вышло. У меня даже была мысль напрочь отказаться от этой раскладки, а вместо нее создать скрипт AHK, который бы заменил мне машинопись!) Очень может быть, что в этих своих недопотугах где-то напортачил на ровном месте и упустил какую-то деталь... Заранее ужасно благодарен за помощь!..

2

Re: AHK: Win+1 в Ctrl+1 – раскладка клавиатуры мешает

adeckwatt пишет:

SC в AHK содержит три символа, а не два

Количество символов (как и их регистр) не имеет значения, нужны только значащие символы, то есть достаточно

^sc2:: SendInput #1

или

^vk31:: SendInput #1

Оба эти варианта должны работать для любой раскладки обычной клавиатуры при нажатии Ctrl + 1. Проверьте, работают ли они у вас в английской раскладке. Если да, проверьте, какие коды у Ctrl и 1 в русской раскладке, совпадают ли коды Ctrl в русской и английской.

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

3

Re: AHK: Win+1 в Ctrl+1 – раскладка клавиатуры мешает

Вот вроде простоя задача и думаете в верном направлении но не то всё.
Проверьте такой код, у меня работает:

Loop, 10	; Назначаем хоткеи LCtrl + N:
 HotKey, % "<^" (A_Index - 1), KKey, On
Return

KKey(){	; Выполняем функцию при нажатии:
 KeyWait, LCtrl, U	; Ожидаем отпускание LCtrl.
 Sleep, 50		; Небольшая задержка, можно убрать если система будет успевать реагировать быстро.
 K := SubStr(A_ThisHotkey, 0)	; Извлекаем вторую нажатую клавишу из строки (0-9).
 SendInput, % "#{" K "}"	; Отправляем необходимое нажатие Win + (0-9).
}
Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK: Win+1 в Ctrl+1 – раскладка клавиатуры мешает

__Михаил__
Если <^1::SendInput #1 не срабатывает, почему должно сработать HotKey, % "<^" (A_Index - 1), KKey, On ?

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

5

Re: AHK: Win+1 в Ctrl+1 – раскладка клавиатуры мешает

teadrinker
Хороший вопрос - почему его код не работает у ТС. Я специально указал слово "Проверьте" в своём посте. Так же попробовал включить эту самую очень полезную машинопись, у меня работает с ней.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

6

Re: AHK: Win+1 в Ctrl+1 – раскладка клавиатуры мешает

Доброго времени суток!

Благодарю всех за оперативные ответы! И прошу прощения за промедление со своей стороны: уведомление об ответе в теме попало в категорию "Рассылки", в итоге не сразу заметил.

Попытаюсь внести ясность в сложившуюся ситуацию.

Я неточно выразился в первом посте, описывая ситуацию, когда проверял на работоспособность указанный мной в первом посте скрипт. Когда при работающем скрипте я просто меняю раскладку, прожатие тех же клавиш не просто ничего не вызывает, а вызывает странное поведение свернутых программ, причем разное. Например, у меня открыт файл в Блокноте обычном, он идет третьим окном по счету; нажимаю Ctrl+3, но раскрывается не файл уже открытый, а создается файл "Безымянный", и вот он уже появляется в развернутом виде. Прожимаю номер браузера (второе окно), так он вообще не реагирует никак. Никаких других скриптов пока не запущено при этом. Я сразу не написал об этом, потому что подумал, что это в принципе неправильно скрипт написан и ошибка лежит более-менее на поверхности.

Итак, еще раз: скрипт вида (причем меня удивил пробел перед SendInput в вашем примере, teadrinker, но и с ним тоже, как оказалось, работает)


<^sc002:: SendInput #1
<^sc003:: SendInput #2
<^sc004:: SendInput #3
<^sc005:: SendInput #4
<^sc006:: SendInput #5
<^sc007:: SendInput #6
<^sc008:: SendInput #7
<^sc009:: SendInput #8
<^sc00a:: SendInput #9

работает в английской раскладке и в Русской обычной как задумано, полная идентичность с Win+1–9. Скрипт __Михаил__ (красиво, но сложно, спасибо!) срабатывает точно так же, в Русской машинописи у меня не работает.

Но с вашей общей подачи я понял, что кнопки, которые я прожимаю физически, – это одно, это как бы пользовательское мое явление, а keyboard hook как бы показывает, как на мое действие реагирует операционная система с работающим в ней скриптом, т. е. это суть, изнанка процесса. То есть я решил изучить одно и то же пользовательское явление (прожатие мной сочетания Ctrl+3, это вызов файла Блокнота) и посмотреть, что покажет keyboard hook на это в разных раскладках. Так вот результат:

Английская раскладка:

A2  01D	 	d	1.67	LControl       	
5B  15B	i	d	0.11	LWin           	
A2  01D	i	u	0.00	LControl       	
33  004	i	d	0.00	3              	
33  004	i	u	0.02	3              	
5B  15B	i	u	0.00	LWin           	
A2  01D	i	d	0.00	LControl       	
A2  01D	 	u	0.14	LControl

Русская обычная:

A2  01D	 	d	3.00	LControl       	
5B  15B	i	d	0.14	LWin           	
A2  01D	i	u	0.00	LControl       	
33  004	i	d	0.00	3              	
33  004	i	u	0.00	3              	
5B  15B	i	u	0.02	LWin           	
A2  01D	i	d	0.00	LControl       	
A2  01D	 	u	0.19	LControl

Русская машинопись:

A2  01D	 	d	4.98	LControl       	
5B  15B	i	d	0.16	LWin           	
A2  01D	i	u	0.00	LControl       	
A0  02A	i	d	0.00	LShift         	
33  004	i	d	0.00	/              	
33  004	i	u	0.00	/              	
5B  15B	i	u	0.00	LWin           	
A0  02A	i	u	0.00	LShift         	
A2  01D	i	d	0.00	LControl       	
A2  01D	 	u	0.16	LControl

Почему-то в Русской машинописи затесался LShift, хотя я его, естественно, не прожимаю. Прогнал пробно другое сочетание – то же самое, Shift вклинивается. Неужели брак ноутбучной клавиатуры? Признаться, иногда у меня возникает мысль (при выполнении других скриптов типа ремаппинга, да и прожатии некоторых горячих клавиш в текстовых редакторах), что Shift как кнопка западает, но я никак не мог установить это эмпирически, да и в принципе взаимодействию с компьютером это не мешало до сего момента... С другой стороны, подождите, если кнопка западает, то она в любой раскладке будет западать одинаково... Значит, это системный косяк?.. (Начинают глохнуть мозги в ночи, сорри.)

Одним словом, я не знаю, что и думать. Может быть, как-то модифицировать мой скрипт (при всем уважении, он попонятнее выглядит, чем таковой от __Михаил__, его только предстоит подробно изучить на досуге), т. е. тупо в него вставить Shift? Ну тройное сочетание клавиш как бы получится, но я-то все равно буду прожимать две кнопки при этом... На всякий случай еще раз упомяну, что у меня есть основной скрипт, где довольно много ремаппинговых приемов собралось, но он сейчас НЕ запущен, т. е. все эти тесты происходят в отдельном файле отдельного скрипта. А так-то этот Shift у меня может как-то с Win-кнопкой пересекаться, так с ходу не вспомню... Но ведь выключение скрипта выключает полностью его функционал и не оставляет следов в реестре (по крайней мере где-то я читал про это в документации AHK)...



P.S.

эту самую очень полезную машинопись

Не уверен, что правильно понял, но – это был сарказм или?) Для программирования, осуществляемого на английской раскладке, конечно, она не поможет, но на русском-то довольно удобно получается, точка и запятая на указательных пальцах всяко быстрее будет, чем... Да даже не знаю, как в обычной раскладке эти знаки препинания получить, много лет пользуюсь машинописью и не пожалел ни разу. Как бы то ни было, я не в претензии, у каждого свое мнение, а на своем я не настаиваю.

7

Re: AHK: Win+1 в Ctrl+1 – раскладка клавиатуры мешает

adeckwatt пишет:

Почему-то в Русской машинописи затесался LShift

Шифт появляется, если он нужен для посыла указанного символа с клавиатуры. Запустите

^1:: Send A

в обычной раскладке, нажмите Ctrl + 1 и посмотрите историю клавиш. Соответственно, AHK считает, что в вашей раскладке, чтобы послать 3, нужно нажать Shift + /.

Для тройки возможно так сработает:

^sc4:: SendInput #{sc4}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8 (изменено: adeckwatt, 2023-08-23 18:04:01)

Re: AHK: Win+1 в Ctrl+1 – раскладка клавиатуры мешает

teadrinker пишет:

Шифт появляется, если он нужен для посыла указанного символа с клавиатуры.

Да, действительно, так и есть, раскладка это подразумевает. Мне просто думалось, что вот эти выверты с SC позволяют как раз обойти Shift. В итоге так и вышло, потому что

^sc4:: SendInput #{sc4}

решил проблему: этот код работает и в Русской обычной, и в Русской машинописной раскладках. Даже обидно теперь, что я сам не допер прописать SC-код в оба конца, так сказать. Тем не менее это победа, спасибо огромное!)

__Михаил__ пишет:

Так же попробовал включить эту самую очень полезную машинопись, у меня работает с ней.

Вот это, наверное, последняя тайна в этой теме осталась, почему у меня так и не сработал основной вариант, хотя у других он, как я понял, функционирует. Наверное, объяснение кроется в какой-нибудь программистской карме.)



Чуть не забыл – я же проверил, как вы советовали:

teadrinker пишет:

Запустите

^1:: Send A

в обычной раскладке, нажмите Ctrl + 1 и посмотрите историю клавиш.

и получил вот это:

Русская обычная:

A2  01D	 	d	39.83	LControl       	
31  002	 	d	0.41	1              	
A2  01D	i	u	0.00	LControl       	
E7 0041	U	d	0.00	A              	
E7 0041	U	u	0.00	A              	
A2  01D	i	d	0.01	LControl       	
31  002	 	u	0.22	1              	
A2  01D	 	u	0.28	LControl 

Русская машинопись:

A2  01D	 	d	3.09	LControl       	
31  002	 	d	0.19	№              	
A2  01D	i	u	0.00	LControl       	
E7 0041	U	d	0.00	A              	
E7 0041	U	u	0.00	A              	
A2  01D	i	d	0.02	LControl       	
31  002	 	u	0.11	№              	
A2  01D	 	u	0.08	LControl  

Правда, не очень понял, что это дает, уж простите...

На всякий случай прописываю итоговый рабочий вариант для машинописной русской раскладки:

^sc2:: SendInput #{sc2}
^sc3:: SendInput #{sc3}
^sc4:: SendInput #{sc4}
^sc5:: SendInput #{sc5}
^sc6:: SendInput #{sc6}
^sc7:: SendInput #{sc7}
^sc8:: SendInput #{sc8}
^sc9:: SendInput #{sc9}
^sca:: SendInput #{sca}

Еще раз спасибо вам!


atomix пишет:

Принимаются пожертвования на счет хостинг-провайдера -> https://sprinthost.ru/pay/ (укажите домен - script-coding.com)

Правильно ли я понимаю, что это по-прежнему актуально для форума?

9

Re: AHK: Win+1 в Ctrl+1 – раскладка клавиатуры мешает

adeckwatt пишет:

и получил вот это

Не знаю, почему у вас выдаёт другое, у меня:

A2  01D i u 2.64 LControl
A0  02A i d 0.00 LShift         
41  01E i d 0.02 a             
41  01E i u 0.00 a             
A0  02A i u 0.01 LShift         
A2  01D i d 0.02 LControl

adeckwatt пишет:

Правильно ли я понимаю, что это по-прежнему актуально для форума?

Честно говоря не уверен, подождите лучше специального объявления на форуме. Оно появится на видном месте, когда текущие средства будут заканчиваться.

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

10

Re: AHK: Win+1 в Ctrl+1 – раскладка клавиатуры мешает

adeckwatt
Вы не указывали про ноутбук. У них свои приколы системные.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

11

Re: AHK: Win+1 в Ctrl+1 – раскладка клавиатуры мешает

__Михаил__ пишет:

Вы не указывали про ноутбук. У них свои приколы системные.

Вот никогда не подумал бы... Систему обычно указывают, я пометил... AHK версию, правда, забыл... Буду впредь учитывать, спасибо!