1

Тема: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

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

Помогите пожалуйста, как грамотно заставить работать приведенный в данном примере $x hotkey только в окне main (main := "main window")?

global win1 := "window1"
global main := "main window"

Gui, -border
Gui, Add, Checkbox, gLabel vCheckbox1, Option A
Gui, Add, Checkbox, gLabel2 vCheckbox2, Option B
Gui, Add, Checkbox, vCheckbox3, Option C

Gui, Add, Button, w80 Default, OK
Gui, Add, Button, w80, Cancel
return

OnMessage(0x4A, "WM_NOTIFY")
Return

WM_NOTIFY(wParam, lParam) {
    Gui, Submit, NoHide
    If (lParam = 0x114)
    {

    }
    Return
}

ButtonOK:
    Gui, Submit
    Gui, Cancel
Return

ButtonCancel:
    Gui, Cancel
Return

;---------------- GUI hotkeys ----------------
^!g::
  Gui, Show, , Creator
return

Label:
GuiControlGet, Checkbox1
Hotkey, $x, OptionAscript, % Checkbox1 ? "On" : "Off"
Return


Label2:
GuiControlGet, Checkbox2
Hotkey, $x, OptionBscript, % Checkbox2 ? "On" : "Off"
Return


OptionAscript:
{
    SendInput, {x}
    While GetKeyState("x","P")
    Send, {RButton}
    Return
}


OptionBscript:
{
    SendInput, {x}{Rbutton down}
    keywait, x
    SendInput, {Rbutton up}
    return
}

2

Re: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

Читайте про #If.

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

3

Re: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

teadrinker пишет:

Читайте про #If.

Я знаком с #If. Если я добавлю #If WinActive(main), на первый взгляд все работает как надо:

#If WinActive(main)  ;<<<----------- добавляю #If WinActive(main)
Label:
GuiControlGet, Checkbox1
Hotkey, $x, OptionAscript, % Checkbox1 ? "On" : "Off"
Return


Label2:
GuiControlGet, Checkbox2
Hotkey, $x, OptionBscript, % Checkbox2 ? "On" : "Off"
Return
#If					;<<<---------- Закрываю #If

OptionAscript:
{
    SendInput, {x}
    While GetKeyState("x","P")
    Send, {RButton}
    Return
}


OptionBscript:
{
    SendInput, {x}{Rbutton down}
    keywait, x
    SendInput, {Rbutton up}
    return
}

Но если добавить ниже код на активацию третьего чекбокса, который должен работать в другом окне, тогда Label1 и Label2 перестают работать в основном окне (main).


#If WinActive(main)  ;<<<----------- добавляю #If WinActive(main)
Label:
GuiControlGet, Checkbox1
Hotkey, $x, OptionAscript, % Checkbox1 ? "On" : "Off"
Return


Label2:
GuiControlGet, Checkbox2
Hotkey, $x, OptionBscript, % Checkbox2 ? "On" : "Off"
Return
#If					;<<<---------- Закрываю #If

OptionAscript:
{
    SendInput, {x}
    While GetKeyState("x","P")
    Send, {RButton}
    Return
}


OptionBscript:
{
    SendInput, {x}{Rbutton down}
    keywait, x
    SendInput, {Rbutton up}
    return
}


#If Checkbox3 && WinActive(win1)
$r::
Send, v
Return
#If

4

Re: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

uNseen пишет:

Я знаком с #If

Скорее всего, плохо знакомы, #If используется только для горячих клавиш.
Но я тоже не очень внимательно прочитал вопрос.

uNseen пишет:

как грамотно заставить работать приведенный в данном примере $x hotkey только в окне main

Для горячих клавиш, созданных с помощью команды Hotkey, используется Hotkey, If [, Expression].

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

5

Re: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

На всякий случай пример:

Hotkey, If, WinActive("ahk_class Notepad")
Hotkey, x, Label, On
return

Label:
   MsgBox Это сообщение появится`, только когда активно окно блокнота.
return

#If WinActive("ahk_class Notepad")
#If
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6 (изменено: uNseen, 2024-02-06 05:36:42)

Re: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

teadrinker пишет:

Скорее всего, плохо знакомы, #If используется только для горячих клавиш.

Так я и не говорил, что хорошо знаком... ) О таких нюансах мне, конечно, не известно


teadrinker пишет:

Но я тоже не очень внимательно прочитал вопрос.

uNseen пишет:

как грамотно заставить работать приведенный в данном примере $x hotkey только в окне main

Для горячих клавиш, созданных с помощью команды Hotkey, используется Hotkey, If [, Expression].

Спасибо за наводку, у меня получилось, добавив Hotkey, IfWinActive , %main%

Label:
GuiControlGet, Checkbox1
Hotkey, IfWinActive , %main%
Hotkey, $x, OptionAscript, % Checkbox1 ? "On" : "Off"
Return

Label2:
GuiControlGet, Checkbox2
Hotkey, $x, OptionBscript, % Checkbox2 ? "On" : "Off"
Return

Я уже очень рад!!! потому что долгое время мучился с этим вопросом.

Но есть нюанс. Hotkey, IfWinActive , %main% при этом распространяется и на Label2, хотя я там эту строку кода не прописывал. Если я запущу GUI и ни разу не использую Checkbox1, то Label2 будет работать в любых окнах, как и положено, поскольку там конкретное окно не прописано. Но если я в процессе эксплуатации GUI активирую checkbox1 хотя бы один раз (и дезактивирую), Label2 станет работать только в том окне, которое прописано в Label1 (в данном случае main).
Это как-то можно исправить?

Также я попробовал ваш пример, ситуация повторяется:

Label:
Hotkey, If, WinActive(main)
GuiControlGet, Checkbox1
Hotkey, $x, OptionAscript, % Checkbox1 ? "On" : "Off"
Return

#If WinActive(main)
#If


Label2:
GuiControlGet, Checkbox2
Hotkey, $x, OptionBscript, % Checkbox2 ? "On" : "Off"
Return

7

Re: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

Команда Hotkey, If, WinActive(main) действует на все горячие клавиши, созданные через Hotkey, расположенные ниже. Чтобы отключить это условие, вызовите перед объявлением горячей клавиши Hotkey, If.

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

8

Re: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

Спасибо!

9

Re: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

teadrinker
Еще такой вопрос.

Допустим есть скрипт, в конце которого return

$x::
	SendInput, {x}
	While GetKeyState("x","P")
	Send, {RButton}
Return

При имплементации этого скрипта через Label нужен ли еще один return?


Label:
GuiControlGet, Checkbox1
Hotkey, $x, OptionAscript, % Checkbox1 ? "On" : "Off"
Return


OptionAscript:
{
	SendInput, {x}
	While GetKeyState("x","P")
	Send, {RButton}
	Return
}
return ;<---------- Здесь необходим return?

10

Re: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

uNseen пишет:
OptionAscript:
{
	SendInput, {x}
	While GetKeyState("x","P")
	Send, {RButton}
	Return
}
return ;<---------- Здесь необходим return?

Фигурные скобки вокруг содержимого метки не нужны. Должно выглядеть так:

OptionAscript:
	SendInput, {x}
	While GetKeyState("x","P")
	Send, {RButton}
Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11 (изменено: uNseen, 2024-02-06 20:52:57)

Re: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

Понял, спасибо.

12

Re: AHK: Как застваить gLabel vCheckbox работать в заданном окне?

Пожалуйста, только точку верните на место.

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