1

Тема: AHK: Послать нажатие клавиши и запустить триггер

Пишу клавиатурный тренажер на autohotkey. Меня все устраивает, но периодически перестают отвечать горячие клавиши. В разный момент времени. Разные горячие клавиши. Мне нужен тестер, чтобы определить, как часто перестают работать хоткеи.

Задача.
Сделать так, чтобы каждые там 200мс эмулировалось нажатие верной клавиши и запускался тот же обработчик, что запускается при ее физическом нажатии. Как будто, это человек сидит и работает с тренажером.

Обработчик нажатия у меня так выглядит.


#IfWinActive, GO 
sc13::
InputKey:=1
goto obr
Return

2

Re: AHK: Послать нажатие клавиши и запустить триггер

1. Ставили привязку к клавиатуре?
#InstallKeybdHook
2. Какие клавиши конкретно не работают? Может дело в самой клавиатуре? (в таком случае незачем эмулировать нажатия)
3. Думаю легче было бы скинуть исходник и в нём бы помогли разобраться.

Начинающий скриптер.
По вопросам сюдой: Skype: live:ddeeeennn

3 (изменено: gryphonn, 2017-08-10 12:59:48)

Re: AHK: Послать нажатие клавиши и запустить триггер

MandarinKa02
Спасибо за ответ
1. Куда эту команду надо поставить?
2.  Никакой закономерности нет. Разные клавиши перестают обрабатываться. В разное время. Иногда после 10 минут работы с программой, а иногда и сразу. На разных клавиатурах. Программу скачивало несколько сотен человек. Многие жаловались на ту же проблему.
Очень нужно решить её ... Прямо вся программа портится из-за этого

3. Исходник сейчас скину

помогите добрые люди. Прямо вообще печаль из-за этого.
Из-за того, что клавиши перестают отвечать непредсказуемо, мне и нужен был тестер.

PS. Прогресс-бары закомментированы пока.

Post's attachments

1.rar 1.71 mb, 10 downloads since 2017-08-10 

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

4 (изменено: MandarinKa02, 2017-08-10 13:20:24)

Re: AHK: Послать нажатие клавиши и запустить триггер

gryphonn
Попробуйте в самое начало приписать: #InstallKeybdHook и SetKeyDelay, 0

Получится так:

#SingleInstance force
#NoEnv
ListLines, Off
#KeyHistory, 0
SetKeyDelay, 0
#InstallKeybdHook

lin1pos:=337,lin2pos:=427,lin3pos:=516,
x1 := 361, x2 = 381, x3 = 419,x4=649,x5=668,x6=706,x7=x1+77,x8=x2+77,x9=x3+77,x10=x4-77,x11=x5-77,x12=x6-77,x13=x1-77,x14=x2-77,x15=x3-77,x16=x4+76,x17=x5+76,x18=x6+76,x19=x13-77,x20=x14-77,x21=x15-77,x22=x16+77,x23=x17+77,x24=x18+77,x25=x19-77,x26=x20-77,x27=x21-76,x28=x22+77,x29=x23+77,x30=x24+77,x31=91,x32=x31+77,x33=x32+77,x34=x33+77,x35=x34+77,x36=x35+133,x37=x36+77,x38=x37+77,x39=x38+77,x40=x39+77,x41=x40+77,x42=x41+77,x43=x28+77,x44=x43+77,x45=x29+77,x46=x44+77,x47=x31-77
y1:= lin1pos, y2=lin2pos, y3=lin3pos,y4:=lin1pos,y5 =lin2pos,y6 =lin3pos,y7:=lin1pos,y8 =lin2pos,y9 =lin3pos,y10:=lin1pos,y11 =lin2pos,y12 =lin3pos,y13:=lin1pos,y14 =lin2pos,y15 =lin3pos,y16:=lin1pos,y17 =lin2pos,y18 =lin3pos,y19:=lin1pos,y20 =lin2pos,y21 =lin3pos,y22:=lin1pos,y23 =lin2pos,y24 =lin3pos,y25:=lin1pos,y26 =lin2pos,y27 =lin3pos,y28:=lin1pos,y29 =lin2pos,y30 =lin3pos,y31=227,y32=227,y33=227,y34=227,y35=227,y36=227,y37=227,y38=227,y39=227,y40=227,y41=227,y42=227,y43=y28,y44=y28,y45=y29,y46=y44,y47=y31


IniFile:= a_scriptdir . "\settings.ini"

Screen:=1

Начинающий скриптер.
По вопросам сюдой: Skype: live:ddeeeennn

5

Re: AHK: Послать нажатие клавиши и запустить триггер

MandarinKa02

Спасибо. Попробую. Со временем посмотрим на результат.

6

Re: AHK: Послать нажатие клавиши и запустить триггер

В одной из тем здесь на форуме тоже жаловались на ту же проблему...

7

Re: AHK: Послать нажатие клавиши и запустить триггер

По тестировщику вопрос открыт еще. Он все равно нужен

8 (изменено: stealzy, 2017-08-10 14:57:10)

Re: AHK: Послать нажатие клавиши и запустить триггер

Чудище обло, озорно, огромно, стозевно и лаяй

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

Например вот эту портянку (приведу только обрывок):

#IfWinActive, GO
+sc2B::
InputKey:=146
goto obr
return
#IfWinActive, GO
sc29::
InputKey:=47
goto obr
return
#IfWinActive, GO
+sc29::
InputKey:=147
goto obr
return

Можно заменить так:

#IfWinActive GO
sc2B:: ; \
sc29:: ; `
+sc29::
	obr()
	Return
#If

obr() {
	static Array := {"sc2B": 146, "sc29": 47, "+sc29": 147}
	MsgBox % Array[A_ThisHotkey]
}

Действие #If оказывается на все ГК до следующего #If, нет смысла писать перед каждой ГК.
Также после goto нет смысла писать Return, в отличие от gosub или вызова ф-ии.

И в других местах у вас тоже самое.

9

Re: AHK: Послать нажатие клавиши и запустить триггер

stealzy
Спасибо большое за совет! Так действительно намного лучше.

Я перепишу с учетом вашей рекомендации, а там посмотрим, будет ли зависать.

Вы писали про другие места. Если не трудно, не могли бы просто указать на них?

10 (изменено: stealzy, 2017-08-10 16:55:08)

Re: AHK: Послать нажатие клавиши и запустить триггер

key := "ка\ё ", arr := StrSplit(key). Строгий синтаксис с ":=" и кавычками позволил захватить пробел в конце строки.
Имхо, лучше чтобы происходящее было понятно даже на одном экране.
Оператор goto усложняет понимание, а метки и ф-ии упрощают, потому что исполнение всегда возвращается назад. Функции удобно переиспользовать, и можно не боятся пересечения внутренних переменных с глобальными, и глобальных нужно меньше, что опять таки упрощает понимание.
Форматирование кода отступами позволяет видеть структуру кода и сворачивать блоки кода по уровням вложенности (в Notepad++ и SciTe сворачиваются блоки внутри фиг.скобок, в Sublime сворачивание по отступам).
Для языков и ф-ий Step%N% можно отделить код от данных.

ArrLangID := {"Английский": 2, "Арабский": 6}
MsgBox % ArrLangID[Language]

MainCycle можно сделать через таймер.

11

Re: AHK: Послать нажатие клавиши и запустить триггер

stealzy

Благодарю за развернутый ответ. Постараюсь въехать. Это уже на новый уровень мне надо переходить и действительно переосмыслить все.

Я пытался функциями изначально оперировать, но не понял, как. Плюс функции надо кучу параметров передавать. Либо делать много мелких функций. Не дорос еще, наверно.

Перешел на саблайм, а здесь сворачивание по отступам, неудобно короче, так и не пользуюсь пока.

"MainCycle можно сделать через таймер"

У меня там просто переменный период. Если только перезапускать этот таймер, неудобно

12 (изменено: gryphonn, 2017-08-10 17:42:07)

Re: AHK: Послать нажатие клавиши и запустить триггер

stealzy пишет:

key := "ка\ё ", arr := StrSplit(key). Строгий синтаксис с ":=" и кавычками позволил захватить пробел в конце строки.
Имхо, лучше чтобы происходящее было понятно даже на одном экране.

Первую строку не понял я. И про захват пробела. Поясните, пожалуйста.

Аа, теперь понял, кажется. Прикольно.
Со следующих проектов будем делать по уму. Совершенствовать код можно до бесконечности) Мне бы сейчас избавиться от глюков с горячими клавишами...

13 (изменено: stealzy, 2017-08-10 18:59:27)

Re: AHK: Послать нажатие клавиши и запустить триггер

#Persistent
global a:="global", b:=42
c := "Цикл исолняется за разное время. Новый начинается после окончания предыдущего."
SetTimer MainCycle, -1
Return

MainCycle() {
	static i:=0
	ToolTip % a " " c " " ++i
	Sleep % Rnd(100, 1000)
	SetTimer MainCycle, -1
}

Rnd(min, max) {
	Random, rnd, min, max
	Return rnd
}

14

Re: AHK: Послать нажатие клавиши и запустить триггер

stealzy

Круто, респект вам!! А я везде глобал писал в самих функциях. Вы ответили на мой не заданный вопрос! Таймер тоже работает.
Надо будет собраться силами и все переписать

Скажите пожалуйста. Вся эта оптимизация помимо визуального восприятия и сокращения кода какую пользу несет? Может это решить проблему глюков?

15 (изменено: stealzy, 2017-08-11 06:21:29)

Re: AHK: Послать нажатие клавиши и запустить триггер

На 95% уверен, что ваши глюки - не по вине ahk, а какой-то просчет в коде.
Вполне возможно, что в ходе разгребания глюк исчезнет сам.
Но тестировать не возьмусь , разве что дадите воспроизводимый алгоритм.
Если будете писать тестер, можете сделать его таймером в отдельном скрипте (можно даже так, чтобы нажатия посылались только в окно тренажера при активном другом окне, но тогда подход с #IfWinActive придется менять).
Если же в одном скрипте с тренажером, используйте SendLevel или #InputLevel.

16

Re: AHK: Послать нажатие клавиши и запустить триггер

stealzy
Хотел бы я верить, что мой глюк. Просто перестает отвечать именно один хоткей, я это проверяю. Даже та же клавиша, но с шифтом отвечает.

Пофиксю, там посмотрим. Спасибо за совет с отдельной программой для тестера. Данные о правильной клавише буду кидать в буфер обмена)

Сперва попробую сам, потом к вам обращусь. Я готов оплатить в случае чего

17 (изменено: MandarinKa02, 2017-08-11 19:20:12)

Re: AHK: Послать нажатие клавиши и запустить триггер

gryphonn Могу вам помочь усовершенствовать скрипт. Всё равно делать нечего)
Skype:

+ мой скуп
+ я тут
+ почти
+ открыть спойлер

live:ddeeeennn

Начинающий скриптер.
По вопросам сюдой: Skype: live:ddeeeennn

18

Re: AHK: Послать нажатие клавиши и запустить триггер

Ну вот, только один, а говорили разные. Попробуйте задать его через vk код вместо sc.

19

Re: AHK: Послать нажатие клавиши и запустить триггер

stealzy

В один момент времени не отвечает именно один хоткей. Но в другой раз не отвечает уже другой. Это я имел в виду. Никакой закономерности я не обнаруживаю.

20

Re: AHK: Послать нажатие клавиши и запустить триггер

MandarinKa02
у меня к тебе будет другое предложение. в скайпе спишемся

21

Re: AHK: Послать нажатие клавиши и запустить триггер

stealzy
Не понимаю я как программно послать клавишу, чтобы сработал хоткей. В текстовом редакторе набирается эта буква, но метка горячей клавиши не срабатывает.

Пока нашел решение через экранную клавиатуру. По ней тыкать мышкой)) Так работает

22

Re: AHK: Послать нажатие клавиши и запустить триггер

В одном скрипте с ГК? См. 15 сообщение.

23

Re: AHK: Послать нажатие клавиши и запустить триггер

stealzy

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

Пока ничего не глючило. Буду дальше тестить

24

Re: AHK: Послать нажатие клавиши и запустить триггер

stealzy

я эти send не очень то понимаю. Больно много там команд разных.

если в двух словах сможете разъяснить, в чем их особенности, буду очень благодарен.

25

Re: AHK: Послать нажатие клавиши и запустить триггер

gryphonn, новый скайп сделал ибо от старого пароль забыл

+ открыть спойлер

live:ddeeeennn

Начинающий скриптер.
По вопросам сюдой: Skype: live:ddeeeennn