Что делает это выражение? Gui % (MainGui: =!MainGui) ? «Скрыть»: «Показать»

#if-statement #timer #autohotkey

#if-оператор #таймер #автоотключение

Вопрос:

Я нахожу этот код в этом потоке: приостановка, приостановка, скрытие, открытие окна GUI:

 Gui % (MainGui:=!MainGui) ? "Hide" : "Show"
  

Что он делает? Я предполагаю, что это своего рода простое if выражение для горячих клавиш, но, проверяя примеры на двух страницах, я не вижу, где оно находится.

Если SetTimer используется, счетчик будет увеличиваться только в том случае, если этот код помещен внутрь подпрограммы. Если поместить снаружи, счетчик останавливается.

 Gui  LastFound  AlwaysOnTop  ToolWindow -Caption
Gui, Add, Text, vcounter, 00000
Gui, Show, NoActivate 

SetTimer, Update, 100 ; 100 ms
Update:
    counter  
    GuiControl,, counter, %counter%
    ^esc::Gui % (MainGui:=!MainGui) ? "Hide" : "Show"
Return 
  

Ответ №1:

Это своего рода оператор в выражениях:

Тернарный оператор [v1.0.46 ]. Этот оператор является сокращенной заменой оператора if-else . Он оценивает условие в своей левой части, чтобы определить, какая из двух его ветвей должна стать его конечным результатом. Например, var := x>y ? 2: 3 сохраняет 2 в переменной, если x больше y; в противном случае он сохраняет 3. Для повышения производительности вычисляется только выигрышная ветвь (см. Оценка короткого замыкания).

Команда ^esc::Gui % (MainGui:=!MainGui) ? "Hide" : "Show" состоит из двух частей.

  1. (MainGui:=!MainGui) Переключает значение переменной MainGui на противоположное, обычно с True на False и наоборот.
  2. Использует стандартную форму троичного оператора для проверки значения переменной MainGui . Если это True так, он использует значение Hide , если это False так, он использует значение Show .

^esc::Gui % (MainGui:=!MainGui) ? "Hide" : "Show" после всех оценок преобразуется в одно из следующих значений:
1. Если MainGui True ==> Gui Hide
2. Если MainGui False ==> Gui Show

Краткое объяснение: ^esc горячая клавиша скрывает графический интерфейс, если он активен, показывает его, если он скрыт.

Комментарии:

1. Я вижу. Знаете ли вы, почему счетчик останавливается, если он помещен вне SetTimer ?

2. Вы должны поместить его после параметра SetTimer, а не раньше.

3. Я знаю. Но почему это так?

4. После определения ^esc горячей клавиши раздел автоматического выполнения заканчивается. Любой код после этого может быть вызван только с помощью горячей клавиши, таймера или функции onMessage() .