Зажимание - отжимание

Опубликуйте ваши работающие скрипты, библиотеки и ПО для AutoHotkey
Kazmadan
Posts: 5
Joined: 03 Jul 2020, 09:52

Зажимание - отжимание

Post by Kazmadan » 25 Sep 2020, 04:16

Lbutton:: Send, % (State1 := !State1) ? "{Lbutton Down}" (a := 1) / 0 : "{Lbutton Up}" (a := 2) / 0

Ребята вот нашел скрипт... Можете расписать что здесь за что отвечает. Я хочу понять как он работает.

User avatar
MostWanted
Posts: 11
Joined: 03 Jan 2021, 07:46
Contact:

Re: Зажимание - отжимание

Post by MostWanted » 22 Feb 2021, 05:25

LButton горячая клавиша (то есть условие, если была нажата левая кнопка мыши):
При этом значение «Down» и «Up» в данной функции означает «нажатие» и «обжатие» той самой левой кнопки.

То есть при нажатии левой кнопки будет произведено сравнение и отправка переменных методом “Send”.

% (State1 := !State1) ? "{Lbutton Down}" (a := 1) / 0 : "{Lbutton Up}" (a := 2) / 0
Дальше идёт сравнение переменных, в зависимости от которого и будет отправлен тот или иной результат. Но, код лучше было бы написать, как описал пользователь mcl методом if.
Last edited by MostWanted on 22 Feb 2021, 20:28, edited 3 times in total.

mcl
Posts: 355
Joined: 04 May 2018, 16:35

Re: Зажимание - отжимание

Post by mcl » 22 Feb 2021, 17:16

Lbutton:: Send, % (State1 := !State1) ? "{Lbutton Down}" (a := 1) / 0 : "{Lbutton Up}" (a := 2) / 0

Lbutton:: − сам хоткей, т.е. всё последующее срабатывает при нажатии на левую кнопку мыши.
Send, % − команда отправки нажатий.
Знак процента говорит, что дальше будет не сырой текст, а выражение, которое надо будет высчитать.

Само выражение состоит из громоздко написанного тернарного оператора: <условие> ? <если_верно> : <если_ложно>

(State1 := !State1) − значение переменной State1 меняется на противоположное (единица на ноль и наоборот).

Если в результате State1 не равен нулю, то вычислится и передастся в команду Send следующая часть:
"{Lbutton Down}" − зажимается левая кнопка мыши;
(a := 1) / 0 − Здесь переменной a присваивается единица, и, видимо, чтобы эта единица не попала в команду Send, всё присваивание делится на ноль − так как делить на ноль нельзя, результатом этого куска будет пустая строка. Конкретно в этом коде эта переменная не используется, и её значение всё равно зависит от State1, так что мне не очень понятно, зачем это всё нужно.

Если State1 в вычисленном условии оказывается нулём, то отправится вторая часть:
"{Lbutton Up}" − левая кнопка мыши отпускается.
(a := 2) / 0 − переменной a присваивается 2 и снова экранируется делением на ноль.

Как результат, при первом нажатии на ЛКМ, ЛКМ зажимается, а при втором – отжимается, то есть, ЛКМ начинает работать как переключатель.

Итого, это можно было бы написать длиннее, зато более понятно, таким образом:

Code: Select all

LButton::
	State1 := Not State1
	If (State1 == 1) {
		Send {LButton Down}
		a := 1
	} Else {
		Send {LButton Up}
		a := 2
	}
	Return
github://oGDIp - GDI+ wrapper for AHK v1.1

User avatar
MostWanted
Posts: 11
Joined: 03 Jan 2021, 07:46
Contact:

Re: Зажимание - отжимание

Post by MostWanted » 22 Feb 2021, 20:19

mcl wrote:
22 Feb 2021, 17:16
Lbutton:: Send, % (State1 := !State1) ? "{Lbutton Down}" (a := 1) / 0 : "{Lbutton Up}" (a := 2) / 0

Lbutton:: − сам хоткей, т.е. всё последующее срабатывает при нажатии на левую кнопку мыши.
Send, % − команда отправки нажатий.
Знак процента говорит, что дальше будет не сырой текст, а выражение, которое надо будет высчитать.

Само выражение состоит из громоздко написанного тернарного оператора: <условие> ? <если_верно> : <если_ложно>

(State1 := !State1) − значение переменной State1 меняется на противоположное (единица на ноль и наоборот).

Если в результате State1 не равен нулю, то вычислится и передастся в команду Send следующая часть:
"{Lbutton Down}" − зажимается левая кнопка мыши;
(a := 1) / 0 − Здесь переменной a присваивается единица, и, видимо, чтобы эта единица не попала в команду Send, всё присваивание делится на ноль − так как делить на ноль нельзя, результатом этого куска будет пустая строка. Конкретно в этом коде эта переменная не используется, и её значение всё равно зависит от State1, так что мне не очень понятно, зачем это всё нужно.

Если State1 в вычисленном условии оказывается нулём, то отправится вторая часть:
"{Lbutton Up}" − левая кнопка мыши отпускается.
(a := 2) / 0 − переменной a присваивается 2 и снова экранируется делением на ноль.

Как результат, при первом нажатии на ЛКМ, ЛКМ зажимается, а при втором – отжимается, то есть, ЛКМ начинает работать как переключатель.

Итого, это можно было бы написать длиннее, зато более понятно, таким образом:

Code: Select all

LButton::
	State1 := Not State1
	If (State1 == 1) {
		Send {LButton Down}
		a := 1
	} Else {
		Send {LButton Up}
		a := 2
	}
	Return
Н-да, мой мозг окончательно заплыл в рабочей рутине, раз я не распознал оператора сравнения в представленном коде.
100 лет не использовал подобных функций, ввиду использования if. Спасибо за более подробный ответ по этой теме.

Post Reply

Return to “Скрипты и библиотеки”