1 (изменено: Indrik, 2025-04-06 03:01:59)

Тема: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

Здравствуйте! Для начала, прикладываю скрипты, в которых наблюдается хрень. Скрипт №1 и скрипт №2.
Скрипт №1:

#SingleInstance force
#InstallKeybdHook
#NoEnv

SetTimer, wr
return

wr:
	WinGet, pname, ProcessName, A
	if pname = emacs.exe
{
	a::b
	b::a
}
else
{
	m::n
	n::m
}
return

c::d
d::c

Скрипт №2:

#SingleInstance force
#InstallKeybdHook
#NoEnv

SetTimer, wr
return

wr:
	WinGet, pname, ProcessName, A
	if pname = emacs.exe
{
	a::
	{
	send, {b}
	}
	b::
	{
	send, {a}
	}
}
else
{
	m::
	{
	send, {n}
	}
	n::
	{
	send, {m}
	}
}
return

c::
{
send, {d}
}
d::
{
send, {c}
}

Как видно из скриптов, а они предельно простые, задача стоит такая:
1. Если запущен Emacs, то: а) при нажатии a, должно посылаться b, б) при нажатии b, должно посылаться a.
2. Если Emacs не запущен, то: а) при нажатии m, должно посылаться n, б) при нажатии n должно посылаться m.
3. И всегда, пока скрипт запущен, независимо от того, является ли окно Emacs активным, или нет (т. е. вне таймера): а) при нажатии c, должно посылаться d, б) при нажатии d, должно посылаться c.
Не ищите практического смысла в этом скрипте - он мне нужен как проверка перед написанием более сложного. И хорошо, что я решил сделать такой проверочный скрипт, т. к. проверка не прошла. Скрипт не ведёт себя как ожидается.
А именно - он всё время непрерывно посылает n, словно я зажал клавишу m. Например, если перевести фокус на рабочий стол и переключить на инглиш, то начинают миганть все иконки, начинающиеся на n (в т. ч. на прописную). А если перевести фокус на Блокнот, то в нём начинают печататься буквы n в английской раскладке и т в русской. В Emacs-e он печатает (но непрерывно, а только когда нажимаешь!) и a вместо b, и b вместо a. И также m вместо n, и n вместо m. Т. е. как будто обе ветки (условная тру и else работают одновременно). И что особенно удивительно - даже если приостановить действие скрипта (suspend hotkeys)!!! Прекращается это только при полном выходе из скрипта.
Вот как так-то?! Всё ж предельно просто, уж куда проще, где тут можно ошибиться?

2 (изменено: Indrik, 2025-04-06 02:55:16)

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

Дополнение.
Описанное выше происходит при запуске Скрипта №1, а при запуске Скрипта №2, появляется вот такое окошко:
см. вложение.
И оно бесконечно не закрывается. Т. е. нажимаешь ОК, появляется снова точно такое же.
При этом, если перевести фокус в Блокнот, то клавиши m и n ничего не печатают.

Я даже рядом не понимаю, что не так. Скобка } явно на своём месте - она закрывает ветку else...
Autohotkey 1.1.33.02

Post's attachments

sc2.jpg 57.2 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

3

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

Горячие клавиши не могут задаваться в блоке if { }.

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

4

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

teadrinker
Тогда так (?):

#SingleInstance force
#InstallKeybdHook
#NoEnv

SetTimer, wr
return

wr:
	WinGet, pname, ProcessName, A
	if pname = Notepad2.exe
	goto, ON
	else
	goto, OFF
return

ON:
	a::b
	b::a
return

OFF:
	m::n
	n::m
return

c::d
d::c

Но это тоже не работает. В Блокноте всё время посылает b.

5

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

Пропустил ваше сообщение.

Indrik пишет:
ON:
	a::b
	b::a
return

Горячие клавиши не могут задаваться и по метке. Они все загружаются сразу, независимо от их расположения в коде. Единственные условия, которые могут влиять на их работу, задаются директивами, которые начинаются со знака #, например:

#IfWinActive ahk_class Notepad
F1::MsgBox Это сообщение появится`, если нажать F1`, когда активно окно блокнота

В справке: Context-sensitive Hotkeys

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

6

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

Используйте Hotkey для динамического указания что включить / выключить.

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

7

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

__Михаил__
Я так понимаю, разница между Hotkey и директивой #IfWinActive в том, что первая создаёт горячие клавиши непосредственно в процессе выполнения скрипта, а вторая - по классике, когда всё заранее известно?

8

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

teadrinker
Да, так намного лучше. Но немного что-то не работает. Вот скрипт:

#SingleInstance force
#InstallKeybdHook
#NoEnv

#IfWinActive ahk_exe Notepad2.exe
a::b
b::a

#IfWinActive
m::n
n::m
c::d
d::c

НЕ в Блокноте всё работает как задумано.
В Блокноте он меняет все буквы, т. е. и a с b, и m с n, и c с d тоже. Т. е. как будто бы он не видит директивы #IfWinActive (без параметров), которая должна (по сути) заканчивать блок с a и b. Либо эта директива работает не так, как написано в доках. Напирмер, она просто разрешает выполнение гор.кл. во всех окнах (т. е. не кроме тех, что есть выше в скрипте, а вообще во всех). Но тогда в ней не было бы смысла, потому что она обесценивала бы наличие предыдущих директив.

9

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

Пробовал менять местами блоки - результат тот же.

10

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

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

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

11

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

В доках есть такой пример:

#IfWinActive ahk_class Notepad
^!a::MsgBox You pressed Ctrl-Alt-A while Notepad is active.  ; This hotkey will have no effect if pressed in other windows (and it will "pass through").
#c::MsgBox You pressed Win-C while Notepad is active.
::btw::This replacement text for "btw" will occur only in Notepad.
#IfWinActive
#c::MsgBox You pressed Win-C in a window other than Notepad.

Важна последняя строка, где сказано:

in a window other than Notepad

Т. е. они подчёркивают, что не в любом вообще, а в любом, кроме Блокнота. А значит эта ветка не должна выполняться, если выполняются другие (если фокус находится в Блокноте). Также и в моём примере, m\n\c\d не должны меняться в Блокноте.
Я вот думаю, может эту бодягу надо в бесконечный цикл завернуть (в таймер тот же)? Но опять же, в доках про это не сказано.

12

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

А может проще указать что-то вроде

#IfWinActive ahk_exe_not Notepad2.exe

Такого нет, я знаю. Для примера просто. Как-то можно задать условие: "Если текущее окно не является Блокнотом"?

13

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

Всё, я туплю ))) Сорян. Так работает:

#IfWinActive ahk_exe Notepad2.exe
a::b
b::a

#IfWinNotActive ahk_exe Notepad2.exe
m::n
n::m
c::d
d::c

14

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

Это other than меня сбило...
Пора отдыхать. Благодарю ))

15

Re: AHK: беспрестанно посылает клавишу, даже если клавиша-ключ не нажата

Там одна и та же клавиша зарегистрирована. В этом случае будет срабатывать тот вариант, который выше в коде.

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