1

Тема: AHK: Блокировка нажатых клавиш

Помогите выполнить следующую задачу:
Есть три клавиши A, S и D.
Надо сделать так чтобы если была нажата один раз клавиша А (или S или D), то она должна напечататься один раз и заблокироваться. А две другие клавиши разблокироваться.
Если нажать другую из оставшихся двух клавиш, например, S, то она должна напечататься один раз и заблокироваться, а D и А соответственно разблокироваться.

2 (изменено: Irbis, 2012-09-18 17:19:26)

Re: AHK: Блокировка нажатых клавиш

*$vk41::
*$vk44::
*$vk53::
if (A_ThisHotKey != A_PriorHotKey)
   SendInput % "{" SubStr(A_ThisHotKey,3) "}"
Return

3 (изменено: avgur, 2012-09-20 02:55:21)

Re: AHK: Блокировка нажатых клавиш

Спасибо, Irbis. Это оригинально, но можно ли подобное сделать как-то без SendInput?
Например, при нажатии на А - скрипт никак не реагирует, а если на А нажать еще раз - хоть сразу, хоть через час - не важно через какое время, т.е. при повторном нажатии на А - эта клавиша блокируется. И разблокируется лишь нажатием S или D как описано в первом посте.
Просто игрулька для которой нужен этот скрипт имеет жесткую систему защиты, любые эмулированные нажатия (любые send'ы и им подобное) не проходят в окно игры.
Я копался в справке по АХК, вот vk41::return - блокирует клавишу, а как заблокировать ее при условии (повторное нажатие) и разблокировать при нажатии на другие определенные клавиши мне не понятно.

4 (изменено: creature.ws, 2012-09-20 10:57:48)

Re: AHK: Блокировка нажатых клавиш

#if !FirstPress() ; клавиши указанные ниже будут срабатывать лишь если нажаты впервые
    vk57::
    vk41::
    vk53::
    vk44::return
#if FirstPress(key := LTrim(A_ThisHotkey, "+")) ; клавиши указанные ниже будут срабатывать лишь если key была нажата более одного раза, при этом состояние key будет сброшено
    +vk57::
    +vk41::
    +vk53::
    +vk44::MsgBox клавиша %key% была заблокирована
#if

FirstPress(resetKeyState = "")
{
    static KeyState := {}
    return resetKeyState? ObjRemove(KeyState, resetKeyState) : !ObjHasKey(KeyState, A_ThisHotkey) && ObjInsert(KeyState, A_ThisHotkey, true)
}

Прочитал первое сообщение

#if !FirstPress()
    vk41::
    vk53::
    vk44::return
#if

FirstPress()
{
    static priorHotkey
    return priorHotkey <> A_ThisHotkey, priorHotkey := A_ThisHotkey
}