1 (изменено: Morty Mels, 2016-04-07 11:16:43)

Тема: AHK: Не прерывается SetTimer

Написал простенький скрипт, но в силу моей необразованности в данном языке, не могу прервать выполнение команд. Буду очень рад, если поможете оптимизировать его!

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

;Моменты основных ошибок буду помечать знаком <<<!>>>

SendKey(Key, Pause) { ;Скрипт на отправление нажатия клавиши в необходимое окно. Работает коряво, тат как печатает в ключевое окно скрипт лишь в том случае, если оно активно, но хоть так... Будет круто, если поможете и с этой проблемой, но это не самое главное.
	ControlSend, , %Key%, WARFRAME
	Sleep Pause
}

OutPoint(Script) { ;Скрипт для проверки активности ключевого окна и остановки скрипта, если активно побочное.
	WinGet, WindowPid, pid, WARFRAME
	WinGet, ActivepPid, pid, A
	if !(ActivePid = WindowPid) {
		SetTimer, %Script%, off ; Не прерывает Mirage4 <<<!>>>
	}
}

~*vk14sc03A::	;Запускаем скрипт Mirage4 если CapsLock включен и ВЫКЛЮЧАЕМ, если выключен. 
	SetTimer, Mirage4, % GetKeyState("CapsLock", "T") ? 0 : "off"; Не прерывает Mirage4 <<<!>>>
return

Mirage4: ; Сам скрипт
	Name:="Mirage4"
	SendKey("{vk53sc01F down}",625)
	SendKey("{vk53sc01F up}",625)
	OutPoint(Name)
	SendKey("{vk57sc011 down}",625)
	SendKey("{vk57sc011 up}",625)
	OutPoint(Name)
	SendKey("{vk34sc005 2}",2500)
	OutPoint(Name)
	SendKey("{vk34sc005}",625)
	SetTimer, %Name%, % GetKeyState("CapsLock", "T") ? 0 : "off"; Не прерывает Mirage4 <<<!>>>	
Exit

2 (изменено: mafckz, 2016-04-05 12:51:44)

Re: AHK: Не прерывается SetTimer

В функции OutPoint() ошибка в именах перемнных (ActivepPid и ActivePid)

Прерывание выполняющегося потока из функции можно осуществить командой Exit.

Условие на активный капслок - (GetKeyState("CapsLock", "T")

Из следующей функции будет прерываться поток, если капслок деактивирован:

OutPoint(Script) { ;Скрипт для проверки активности ключевого окна и остановки скрипта, если активно побочное.
	WinGet, WindowPid, pid, WARFRAME
	WinGet, ActivePid, pid, A
	if ( (ActivePid != WindowPid) or !(GetKeyState("CapsLock", "T")) ) {
		SetTimer, %Script%, off ; Не прерывает Mirage4 <<<!>>>
		Exit
	}
}

3

Re: AHK: Не прерывается SetTimer

Morty Mels, ознакомьтесь с этой темой, отредактируйте заголовок.

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

4

Re: AHK: Не прерывается SetTimer

Для прерывания потока, вроде, return нужно использовать... или я отстал от жизни?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

5 (изменено: stealzy, 2016-04-07 13:00:29)

Re: AHK: Не прерывается SetTimer

Return внутри функции/метки не прерывает потока.
Насколько я понимаю прервать поток извне невозможно.
Можно вынести секцию Mirage4 в отдельный процесс и запускать/прибивать его (Run Mirage4.ahk,, m4pid; Process, close, % m4pid).
Либо костыль - добавить проверку в каждую операцию Mirage4:

SendKeyAndCheck(Key, Pause) {
	if (!WinActive("WARFRAME") Or  !GetKeyState("CapsLock", "T"))
		 Exit
	ControlSend, , %Key%, WARFRAME
	Sleep Pause
}

~*vk14sc03A::SetTimer, Mirage4, % GetKeyState("CapsLock", "T") ? 0 : "off"

Mirage4:
	SendKeyAndCheck("{vk53sc01F down}",625)
	SendKeyAndCheck("{vk53sc01F up}",625)
	SendKeyAndCheck("{vk57sc011 down}",625)
	SendKeyAndCheck("{vk57sc011 up}",625)
	SendKeyAndCheck("{vk34sc005 2}",2500)
	SendKeyAndCheck("{vk34sc005}",625)
return

6 (изменено: Alectric, 2016-04-07 18:13:39)

Re: AHK: Не прерывается SetTimer

Редакция первого варианта с кривым форматированием:


SendKey(Key, Pause) {
tooltip,% "Проверка: " Key "`n" Pause
;	ControlSend, , %Key%, WARFRAME
	Sleep Pause
}

OutPoint(Script) {
	WinGet, WindowPid, pid, WARFRAME
	WinGet, ActivepPid, pid, A
	if (ActivepPid != WindowPid or !GetKeyState("CapsLock", "T")) {
		SetTimer, %Script%, off
                return 1
	}
}

~*vk14::	;Запускаем скрипт Mirage4 если CapsLock включен и ВЫКЛЮЧАЕМ, если выключен.
	Name:="Mirage4"
        if !OutPoint(Name)
	  SetTimer, %Name%,0
return

Mirage4: ; Сам скрипт
tooltip,% "Проверка таймера: " a_tickcount,0,,2
	Name:="Mirage4"
if !OutPoint(Name)
	SendKey("{vk53 down}",625)
if !OutPoint(Name)
	SendKey("{vk53 up}",625)
if !OutPoint(Name)
	SendKey("{vk57 down}",625)
if !OutPoint(Name)
	SendKey("{vk57 up}",625)
if !OutPoint(Name)
	SendKey("{vk34 2}",2500)
if !OutPoint(Name)
	SendKey("{vk34}",625)
if OutPoint(Name)
  sleep,100
return

И зачем отправлять виртуальный и скан код одновременно, мне кто-нибудь ответит?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

7

Re: AHK: Не прерывается SetTimer

SendKey(Key, Pause, Script, TogleChat, Out) {
	WinGet, WindowPid, pid, WARFRAME
	WinGet, ActivePid, pid, A
	if (((ActivePid != WindowPid) or !GetKeyState("CapsLock", "T") or (TogleChat="true")) and (Out="true")) {
		SetCapsLockState, off
		SetTimer, %Script%, off
		Exit 
	}
	Send, %Key%
	Sleep Pause
}

Mirage4:
	Name:="Mirage4"
	SendKey("{vk34 2}", 2500, Name, TogleChat, "true")
	SendKey("{vk34}",625, Name, TogleChat, "true")
	SendKey("{vk53 down}", 625, Name, TogleChat, "true")
	SendKey("{vk53 up}",625,  Name, TogleChat, "false")
	SendKey("{vk57 down}",625, Name, TogleChat, "true")
	SendKey("{vk57 up}",625, Name, TogleChat, "false")
	SetTimer, %Name%, 0
Exit

~*vk14::
	TogleChat:="false"
	Send, {vk54}{vk08}{vk1B}
	SetTimer, Mirage4, 0
return

~*vk54::
	TogleChat:="true"

Я решил проблему примерно так + прикрутил лишнюю функцию

без нее выглядит так

SendKey(Key, Pause, Script, Out) {
	WinGet, WindowPid, pid, WARFRAME
	WinGet, ActivePid, pid, A
	if (((ActivePid != WindowPid) or !GetKeyState("CapsLock", "T")) and (Out="true")) {
		SetCapsLockState, off
		SetTimer, %Script%, off
		Exit 
	}
	Send, %Key%
	Sleep Pause
}

Mirage4:
	Name:="Mirage4"
	SendKey("{vk34 2}", 2500, Name, "true")
	SendKey("{vk34}",625, Name, "true")
	SendKey("{vk53 down}", 625, Name, "true")
	SendKey("{vk53 up}",625,  Name, "false")
	SendKey("{vk57 down}",625, Name, "true")
	SendKey("{vk57 up}",625, Name, "false")
	SetTimer, %Name%, 0
Exit

~*vk14::
	SetTimer, Mirage4, 0
return

8

Re: AHK: Не прерывается SetTimer

Morty Mels, исправьтесь скорее.

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