1 (изменено: fgslm, 2020-07-13 16:51:24)

Тема: AHK: Состояние клавиш в цикле

GetKeyState
В справке написано, что определение состояния таких клавиш в цикле как Caps/Num/Scroll "особенно включенность/отключенность " лучше проверять командой KeyWait поскольку системы с необычными драйверами клавиатуры могут медленно обновлять состояние клавиш.
но примеров использования KeyWait в таком случае совсем нет. Как её использовать в цикле?
потому что, например
при использовании GetKeyState("Capslock", "T") скрипт отказывается работать вообще

toggle := GetKeyState("Capslock", "T")
while toggle
{
...
}
return

или иное

#If GetKeyState("CapsLock","T")
...

на данную команду также скрипт не реагирует.

toggle := GetKeyState("Capslock", "T")
a = 1
loop
{
if toggle and a
...
sleep 100
}
return

Любая проверка внутри цикла toggle/любой другой переменной относящейся к GetKeyState("Capslock", "T")  вешает скрипт, либо он работает не замечая её, что можно сделать?
Можно привести пример работы цикла в зависимости от того включены данные модификаторы или нет?

2

Re: AHK: Состояние клавиш в цикле

fgslm пишет:

В справке написано, что определение состояния таких клавиш в цикле как Caps/Num/Scroll "особенно включенность/отключенность " лучше проверять командой KeyWait поскольку системы с необычными драйверами клавиатуры могут медленно обновлять состояние клавиш.

Где вы такое нашли?

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

3

Re: AHK: Состояние клавиш в цикле

fgslm, первая строчка вашего кода выполнится только один раз. Это значит что переменная toggle вдальнейшем не меняет своего значения, соответственно и смотреть в нее смысла нет. Зачем тут вообще вводить переменную посредника, это лишнее.

toggle := GetKeyState("Capslock", "T")
while toggle
{
	...
}
return

4 (изменено: __Михаил__, 2020-07-14 01:02:29)

Re: AHK: Состояние клавиш в цикле

Крайне костыльно, но пашет:

;Запускаем цикл, который ожидает включения клавиш Numlock / CapsLock / ScrollLock каждые 100мс (каждую):
F2::
KeyWait, %A_ThisHotkey%, U	; Ожидаем отпука текущей клавиши.
Loop
{
 KeyWait, Numlock, T0.1
 Key := GetKeyState("Numlock", "T")=1 ? "Numlock" : 0
 If Key
  Break

 KeyWait, CapsLock, T0.1
 Key := GetKeyState("CapsLock", "T")=1 ? "CapsLock" : 0
 If Key
  Break

 KeyWait, CapsLock, T0.1
 Key := GetKeyState("ScrollLock", "T")=1 ? "ScrollLock" : 0
 If Key
  Break
}

ToolTip, % "Включена клавиша: " Key
Sleep, 5000
ToolTip
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

5 (изменено: fgslm, 2020-07-14 07:21:57)

Re: AHK: Состояние клавиш в цикле

stealzy пишет:

первая строчка вашего кода выполнится только один раз. Это значит что переменная toggle вдальнейшем не меняет своего значения, соответственно и смотреть в нее смысла нет. Зачем тут вообще вводить переменную посредника, это лишнее.

stealzy
Так если даже в цикл её ставить, она не срабатывает циклом ниже

while 1 == 1
{
toggle := GetKeyState("Capslock", "T")
while toggle
{
...
}
return
}
return

6

Re: AHK: Состояние клавиш в цикле

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

Крайне костыльно, но пашет:

;Запускаем цикл, который ожидает включения клавиш Numlock / CapsLock / ScrollLock каждые 100мс (каждую):
F2::
KeyWait, %A_ThisHotkey%, U	; Ожидаем отпука текущей клавиши.
Loop
{
 KeyWait, Numlock, T0.1
 Key := GetKeyState("Numlock", "T")=1 ? "Numlock" : 0
 If Key
  Break

 KeyWait, CapsLock, T0.1
 Key := GetKeyState("CapsLock", "T")=1 ? "CapsLock" : 0
 If Key
  Break

 KeyWait, CapsLock, T0.1
 Key := GetKeyState("ScrollLock", "T")=1 ? "ScrollLock" : 0
 If Key
  Break
}

ToolTip, % "Включена клавиша: " Key
Sleep, 5000
ToolTip
Return

Нет, это тоже не работает. Следующий цикл внутри виснет.

7

Re: AHK: Состояние клавиш в цикле

fgslm
А зачем вам циклы в цикле?

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

8

Re: AHK: Состояние клавиш в цикле

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

fgslm
А зачем вам циклы в цикле?

Я не знаю как подругому заставить работать скрипт непрерывно по ключу.

9

Re: AHK: Состояние клавиш в цикле

fgslm
Приведите пример кода, так может будет хоть немного понятно где проблема.

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

10 (изменено: fgslm, 2020-07-18 08:24:53)

Re: AHK: Состояние клавиш в цикле

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

fgslm
Приведите пример кода, так может будет хоть немного понятно где проблема.

Как пример с использованием команды KeyWait из вашего примера:


#If GetKeyState("CapsLock","T")
F2::
KeyWait, %A_ThisHotkey%, U	; Ожидаем отпука текущей клавиши.
Loop
{
 KeyWait, CapsLock, T0.1
 Key := GetKeyState("CapsLock", "T")=1 ? "CapsLock" : 0
 If Key
  Break

while 1 == 1
{
if RepeatPress
break
else
{
;ToolTip %toggle%
PixelGetColor, M, 13, 146
PixelGetColor, RM, 24, 146
;ToolTip %M%
if (toggle && M != 0x000000 && RM != 0x000000)
SendInput {1}
;ToolTip %M%
sleep 1
{
PixelGetColor, R, 13, 161
PixelGetColor, RR, 24, 161
if (R != 0x000000 && RR != 0x000000) 
SendInput {2}
sleep 1
}
{
PixelGetColor, V, 13, 173
PixelGetColor, RV, 24, 173
if (V != 0x000000 && RV != 0x000000)
SendInput {3}
sleep 1
}
}
}
return
}

ToolTip, % "Включена клавиша: " Key
Sleep, 5000
ToolTip
Return

Через  GetKeyState тоже не лучше - скрипт спотыкается и больше работать не хочет.

11 (изменено: __Михаил__, 2020-07-18 18:57:26)

Re: AHK: Состояние клавиш в цикле

fgslm
Ваш вариант написания кода - ужас в моих глазах:
- Отступы, без них сложно понять что к чему относится.
- "while 1 == 1" - совсем не понятно, для чего?
- RepeatPress откуда взялось?
- toggle - тоже зачем? Она не создаётся где либо как и RepeatPress.

Опишите цель скрипта. Я так понял:
- Если включен капс, разрешить перехват клавиши F2.
- При нажатии F2 поиск пикселей и при нахождении посыл клавиши (в зависимости обнаружен ли цвет в нужных позициях).

Тогда вопрос - зачем нужно определять включенность клавиши моим методом - если её итак хорошо определяет сам скрипт:

#If GetKeyState("CapsLock","T")
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

12 (изменено: fgslm, 2020-07-19 08:27:44)

Re: AHK: Состояние клавиш в цикле

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

Тогда вопрос - зачем нужно определять включенность клавиши моим методом - если её итак хорошо определяет сам скрипт:

Чтобы можно было выключить/поставить на паузу скрипт. Потому что на другие команды он не реагирует. Где бы я не задавал ~Pause/Suspend они не останавливают скрипт. (А именно ту часть, которая ищет пиксели) А если останавливают то не запускают снова.

13

Re: AHK: Состояние клавиш в цикле

Pause/Suspend лично не использую. Мне проще установить ограничения, либо указать кнопку на выход из цикла. Например, пока нажата ЛКМ производится цикл, когда отпущу - прерывается.

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

14

Re: AHK: Состояние клавиш в цикле

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

кнопку на выход из цикла

Но он в него опять заходит, потому что цикл указан как бесконечный, и на какой модификатор включить условие "пока" я не знаю. Вот с Caps/Num и т.п. не работает

15

Re: AHK: Состояние клавиш в цикле

В теле цикла указать условие на выход - некая переменная равна 1 = выход из цикла. Ранее в моём коде уже было такое - ожидаем клавишу если была нажата - выход из цикла.
Можно объявить хук клавиши. После нажатия на неё меняет переменной значение, в теле цикла это событие обрабатывается и меняет значение переменной обратно, выключает хук клавиши.

Или я чего не понимаю?

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

16 (изменено: fgslm, 2020-07-19 18:22:45)

Re: AHK: Состояние клавиш в цикле

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

Можно объявить хук клавиши. После нажатия на неё меняет переменной значение, в теле цикла это событие обрабатывается и меняет значение переменной обратно, выключает хук клавиши.

Дак запускать то назад как будешь?
Это разные клавиши и на запуск и на выход? Оно у меня и есть, проверяет значение функции и выходит если используется. Но это автоматически, а не по нажатию. Код то для того чтобы автоматизировать действия, а не прибавить нажатий.
Непонимаю почему не работает Suspend и Pause для циклов...

17 (изменено: fgslm, 2020-07-19 21:30:00)

Re: AHK: Состояние клавиш в цикле

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

- При нажатии F2 поиск пикселей и при нахождении посыл клавиши (в зависимости обнаружен ли цвет в нужных позициях).

Ладно, щас сформулирую - скрипт ожидает включения клавиши (CapsLock к примеру), но она не просто тыкнул, а чтобы её состояние через GetKeyState("Capslock", "T") = D т.е. 1, т.е. вкл. А затем начинает работать цикл.
Если GetKeyState("Capslock", "T") = U, т.е. 0, т.е. выкл, то цикл не работает. Вот идея.


-------------------------

Ну то есть он вот так

while 1 == 1
{
toggle := GetKeyState("Capslock", "T")
if toggle = 0
Pause
else
Выйти из паузы!!!
}
return

Работает,
но вот только из паузы не выходит
Есть обратная команда?

18 (изменено: __Михаил__, 2020-07-19 21:38:10)

Re: AHK: Состояние клавиш в цикле

Поэтому я не использую паузу) - фиг поймёшь как оно работает, а как нет.

Возможно так нужно паузу вырубать:

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

19

Re: AHK: Состояние клавиш в цикле

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

Pause, off

Нет

20 (изменено: fgslm, 2020-07-23 14:34:38)

Re: AHK: Состояние клавиш в цикле

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

После нажатия на неё меняет переменной значение, в теле цикла это событие обрабатывается и меняет значение переменной обратно, выключает хук клавиши.

Где в таком случае надо объявлять переменную? Т.е. где находится её область видимости и доступа?
Если я напишу перед циклом a = 0, а внутри a = 1, и при следующей проверке в другой части цикла какому значению она будет равна?
Где-то видел приписку к переменной global перед изменением значения. Где в таком случае будет видна переменная?
-------
Как этой командой одновременнопроверить несколько клавиш?

 
Key := GetKeyState("Alt", "P")=1 ? "Alt" : 0
 If Key
  Break

Если я напишу функцию, содержащую в себе ссылку  на клавиши, которые надо будет проверять,

TestKey(Hotkey)
Hotkey:: Alt, Ctrl, Shift, a, b, c, v, x, z, n, 1, 2, 3, 4, 5, 6, 7,,,, 

то как её написать?
Чтобы перед циклом указать

Key := GetKeyState("%HotKey%", "P")=1 ? "%HotKey%" : 0

а внутри

if %TestKey%
  Break

Вобще непонятна работа global переменной в отношении циклов и приоритетов потоков

21 (изменено: __Михаил__, 2020-07-23 22:02:10)

Re: AHK: Состояние клавиш в цикле

Лишние проблемы зачем создаёте?
-Переменная будет равна тому значению, что вы указали ранее. Она не имеет возможности сама измениться, как это вообще в голову могло придти?
-global тут не нужна, если вы будете использовать в одной функции.
-Поток в АХК один, псевдопоток можно создать таймером.

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

22 (изменено: fgslm, 2020-07-23 23:11:44)

Re: AHK: Состояние клавиш в цикле

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

таймером.

Это мне еще рано, я еще из цикла свой код вывести не могу
Но я был бы не против если бы вы подсказали как сделать таймер применения чего-то спустя (X) времени после чего-то

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

-global тут не нужна, если вы будете использовать в одной функции.

А если будет функций много?

23

Re: AHK: Состояние клавиш в цикле

Таймер очень просто устроен: Вот тема

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