1

Тема: AHK: Как заблокировать "авто-повтор" на время выполнения скрипта?

Есть офисная клавиатура с дополнительными кнопками быстрого запуска Word, Excel и т.п. По сути кнопка Word, например, просто на аппаратном уровне посылает комбинацию клавиш Ctrl+Alt+D.
Я пытаюсь приспособить эти кнопки для одной онлайн игры скриптами подобно этому:


^!vk44:: 	; Ctrl+Alt+D 

SendInput,{6}{5}

Loop
	{
	SendInput {Numpad8 1}
	Sleep, 45	
	
    GetKeyState, state, vk44, P 
    if state = U 	
        break
	}
	
SendInput,{7} 	 	
Sleep, 1000 		
return

При нажатии кнопки Word без AHK-скрипта выполняется комбинация Ctrl+Alt+D. Если продолжить удерживать Word нажатой, то Alt отпускается и зажатыми остаются Ctrl+D.
С выше приведенным AHK-скриптом при однократном нажатии на кнопку Word, все работает как надо. Но если кнопку нажать и держать (а это приходиться делать чаще всего), то получаются повторяющиеся быстрые нажатия комбинации Ctrl+Alt+D (то что я обозвал "авто-повтором" в названии темы). Это при том что скрипт еще не завершился, ведь он должен завершаться при отпускании кнопки Word.
Дело в том что одновременно с кнопкой Word приходится нажимать еще и F1-F12, и зачастую из-за этого "авто-повтора" получается что срабатывают функции игры, запускаемые по комбинациям Alt+F1 например (которых естественно я не желал), что очень сильно мешает.

Возможно ли как-то избавиться от этого "авто-повтора" до тех пор пока я удерживаю кнопку Word и пока скрипт не закончился?

2 (изменено: BalRoG, 2012-05-02 18:22:03)

Re: AHK: Как заблокировать "авто-повтор" на время выполнения скрипта?

Поглядите в сторону следующих параметров:
чтобы нажатия игнорились а не буферились

#MaxThreadsBuffer Off

чтобы одновременно не шло два потока на кнопку

#MaxThreadsPerHotkey 1

чтобы поток не прерывался другими

Critical

чтобы избежать завершение текущего потока до того как был отпущен последний хоткей

KeyWait

3

Re: AHK: Как заблокировать "авто-повтор" на время выполнения скрипта?

BalRoG пишет:

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

KeyWait

Спасибо, отчасти помогла замена GetKeyState на KeyWait.
Правда появился другой небольшой недостаток - если в цикле есть другие условия, break'ающие Loop, то KeyWait из-за удерживания клавиши (я ведь не робот чтобы отжимать клавишу мгновенно после выполнения условия) не позволяет запускаться другим потокам (что само собой естественно). Впрочем, учитывая сложность вопроса, с этим небольшим неудобством я как-нибудь смирюсь