1 (изменено: Rediska, 2012-08-08 07:44:23)

Тема: AHK: как правильно использовать A_ThisHotkey?

Код работает не совсем так как я от него ожидаю


*Enter::
*NumpadEnter::
	Suspend, Permit
	SendInput % "{" A_ThisHotkey "}"
	;MsgBox, %A_ThisHotkey%
	Sleep 100
	ToggleSuspend()
return

MsgBox всегда выводит *Enter
Хоткей срабатывает, но не важно нажат ли шифт или нет, SendInput отсылает просто ENTER. A мне надо что бы отсылал шифт+ентер если так нажали. Как правильно сделать?

Спасибо за помощь.

2

Re: AHK: как правильно использовать A_ThisHotkey?

Вам кажется, что решение вашей задачи — использование A_thisHotkey.

Если проблема в отправке нажатия с модификаторами : {Blind}
Если речь о «прозрачности» горячей клавиши : ~

3 (изменено: Rediska, 2012-08-08 19:01:49)

Re: AHK: как правильно использовать A_ThisHotkey?

Да, речь шла о прозрачности клавиши. Спасибо в ряде случаев ~ помогла.
А как сделать что бы она не всегда была прозрачна?


q::
w::
e::
*Enter::
*NumpadEnter::
    if (logica)
        SendInput % "{" A_ThisHotkey "}"
return

И еще у A_ThisHotkey есть такая противная штука. Когда я быстро нажимаю QWE, то получаю ЕЕЕ. Я понимаю что это глобальная переменная, но это совсем не то что ожидает юзер
Когда же я разделил функции и убрал A_ThisHotkey :

vk51::	;Q
	if (logica)
		return
	SendInput {vk51}
return

vk57::	;W
	if (logica)
		return
	SendInput {vk57}
return

vk45::	;E
	if (logica)
		return
	SendInput {vk45}
return

То при быстром вводе QWE я иногда получаю на выходе EWQ. По этому поводу вопрос: Как гарантировать последовательную обработку инпутов?

4 (изменено: creature.ws, 2012-08-08 19:23:01)

Re: AHK: как правильно использовать A_ThisHotkey?

«Инпуты» обрабатываются последовательно.
Какие-то у вас скоропалительные выводы.

$vk51::    ;Q
    if (logica)
        return
    SendInput {vk51}
return
 
$vk57::    ;W
    if (logica)
        return
    SendInput {vk57}
return
 
$vk45::    ;E
    if (logica)
        return
    SendInput {vk45}
return

Про $ почитайте в справке, ссылки приводились.

А как сделать что бы она не всегда была прозрачна?

А в данном случае речь не о прозрачности, а о перехвате по условию.

#If logica
    vk51::
    vk57::
    vk45::return
#If

5

Re: AHK: как правильно использовать A_ThisHotkey?

#if не подходит ибо "логика" в ифе не является переменной - это функции. Которые вероятно будут выполнятся каждый раз при нажатии любой кнопки что сильно затормозит и без того тормазнутый скрипт.
Тут я проверяю в фокусе ли мой герой и если да, то выполняю некий каст заклинаний. Если же выбрано что то другое, то я оставляю кнопку как она есть.

vk52::	;R
	if (IsInvoker() && Cast(0x1A0A03, 0x0D0502, 0x1A0A03, 0x0D0502, "QQW", "WWW", "", "Ghost Walk"))
		return
	SendInput {vk52}
return

*Backspace::
	if (IsInvoker() && Combo("EEE"))
		return
	SendInput % "{" A_ThisHotkey "}" ; Так что же тут использовать в таком случае???
return

Насколько я понял, $ предотвращает вызов того же хоткея если он вызывается в нем же. Странно, но у меня нету этих $ и зацикливаний не происходит.

«Инпуты» обрабатываются последовательно.
Какие-то у вас скоропалительные выводы.

Как же тогда объяснить получение EWQ вместо нажатых QWE?
Мне на ум приходит только то что thread который обрабатывал нажатие Q закончил свою работу быстрее(хотя он и запустился позднее) чем это сделали W и Е.

6

Re: AHK: как правильно использовать A_ThisHotkey?

Скорее всего, в последовательности Q-W-E следующее нажатие происходит быстрее, чем обрабатывается условие (logica) первого нажатия.
Тут нужно или изменять логику работы скрипта, чтоб данные функции выполнялись за меньшее время, чем последовательность нажатий, или запретить прерывание работы потока командой Critical, пример имееется в справке.

7 (изменено: creature.ws, 2012-08-08 21:32:42)

Re: AHK: как правильно использовать A_ThisHotkey?

#If IsInvoker()
    vk52::Cast(0x1A0A03, 0x0D0502, 0x1A0A03, 0x0D0502, "QQW", "WWW", "", "Ghost Walk")
    *Backspace::Combo("EEE")
#If

#If  таки подходит тем, что в процессе выполнения IsInvoker() «любой» ввод блокируется.

SendInput % "{" A_ThisHotkey "}" ; Так что же тут использовать в таком случае???

Напрасно игнорируете справку. В «таком» случае использовать SendInput {Blind}{BS}

Если использование #If претит, IsInvoker() выполняется неоднозначно долго и оптимизации не подлежит, очерёдность нажатий критична, игнорирование горячих клавиш при выполнении текущего потока с Critical неприемлемо — используйте собственную очередь выполнения обеспечивающую соответствующую последовательность выполнения IsInvoker() и отправки нажатий.

Лучше было бы поискать возможнось отслеживать «событие изменения фокуса», чем проверять в фокусе ли герой при «каждом чихе».

8

Re: AHK: как правильно использовать A_ThisHotkey?

Игнорирования в случае с Critical не будет, ввод буферизуется.

9

Re: AHK: как правильно использовать A_ThisHotkey?

Верно, значит оптимальный вариант это

10

Re: AHK: как правильно использовать A_ThisHotkey?

#If неприемлем - при нажатии хоткеев, мышка начинает заикаться.
Да Critical в данном случае решает проблему поочередной обработки ввода.
{Blind} также помог

А вообще весь корень зла тут:

PixelGetColor, color, x, y

Про него спрошу в отдельной теме, вдруг кому пригодится.

Всем спасибо за помощь!