1 (изменено: skeleton, 2015-08-27 09:19:01)

Тема: Одновременное нажатие клавиш в игре

Как реализовать алгоритм:

До тех пор пока нажата W (физически) нажать и удерживать SHIFT (логически). Если во время зажатия и удержания W я нажал и удерживаю ЛКМ (физически) SHIFT моментально отпускался (логически). А так же если я сначала нажал и удерживаю ЛКМ и затем нажал и удерживаю W - shift НЕ нажимался.

Т.е. При простом нажатии W нажимался SHIFT, как только W работает совместно с ЛКМ (в любом порядке нажатия) shift отключался.

Вот что у меня получилось но мне кажется этого не достаточно.

~sc11::
    while GetKeyState("sc11","P") and !GetKeyState("LButton","P")
    {
        send {sc2A down}
    }
    send {sc2A up}
    return

2 (изменено: Alectric, 2015-08-27 17:55:43)

Re: Одновременное нажатие клавиш в игре

Так?

#singleinstance,forse
SetBatchLines,-1

time=1 ; время в секундах до возобновления работы shift

loop
{
  sleep,100
  if (!t:=t="" ? 1 : t>time*10 ? 0 : t+1)
    lb=
}

~*vk57:: ; w
if (!lb and !sh)
{
  sh=1
  send,{shift down}
}
return

~*vk57 up::
if (!lb and sh)
{
  sh=
  send,{shift up}
}
return

~*lbutton::
t=1
lb=1
sh=
send,{shift up}
return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3 (изменено: skeleton, 2015-08-27 09:26:21)

Re: Одновременное нажатие клавиш в игре

Как-то сложновато, может есть попроще вариант? В принципе мой код выше тоже работает, но во время игры частенько выскакивает какая-то табличка АХК типа "бла бла... hotkeys 1180 ms... бла бла" и клавиши "да" и "нет" если нажать да - продолжается дальше, если нет - скрипт завершается и выходит из трея. Если бы не эта табличка было бы норм.

Насколько я понял в моем коде пока выполняется условие, шифт нажимается по циклу, а можно ему назначить состояние как будто клавиша Шифт нажата и удерживается?

4 (изменено: Nikva, 2015-08-27 10:07:41)

Re: Одновременное нажатие клавиш в игре

#MaxHotkeysPerInterval 1000
~sc11::
    while GetKeyState("sc11","P") and !GetKeyState("LButton","P")
    {
        Send {sc2A down}
        Sleep, GetKeyState("sc11", "P") ? 200:-1
    }
    Send {sc2A up}
    return

Прочитайте про #MaxHotkeysPerInterval, это про всплывающее сообщение.
И к вашему скрипту добавил задержку (её можно уменьшить, если в игре не успевает срабатывать), т.к. быстрый спам шифтом обычно не нужен.

5 (изменено: skeleton, 2015-08-27 10:55:04)

Re: Одновременное нажатие клавиш в игре

Спасибо за подсказку по MaxHotkeysPerInterval, вот только не пойму какая горячая клавиша по W запускается? Вроде нет ничего...

и можно пояснить что делает строчка Sleep, GetKeyState("sc11", "P") ? 200:-1

6 (изменено: Nikva, 2015-08-27 13:08:08)

Re: Одновременное нажатие клавиш в игре

Точно как она работает я не знаю, но мне обычно помогает.
Может-быть слишком частый спам Send'ом вызывает это окошко.

Sleep, GetKeyState("sc11", "P") ? 200:-1(Тернарный условный оператор).
Если коротко: Ждёт если клавиша нажата 200ms или если не нажата -1 (т.е. нет задержки).

7 (изменено: Alectric, 2015-08-27 17:56:33)

Re: Одновременное нажатие клавиш в игре

GetKeyState("sc11", "P") ? 200:-1

Какой смысл в этом операторе, если цикл завершается при отпускании кнопки?
Результат всегда будет 200.

while GetKeyState("sc11","P")

...
И какой смысл каждые 200 ms отправлять нажатие {Shift Down}, если его можно нажать 1 раз?
Или я чего-то не знаю и повторно нажатие не воспринимается?

...
Поправил код.

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

8 (изменено: skeleton, 2015-08-28 11:12:36)

Re: Одновременное нажатие клавиш в игре

~*sc11::
    shag:=0
    send {shift down}
return

~*sc11 up::
    if (!shag)
    {
        send {shift up}
    }
return

~LButton & sc11::
    if (!shag)
    {
        send {shift up}
        shag:=1
    }
    while GetKeyState("sc11","p") or GetKeyState("LButton","p")
    {
    }
return

В блокноте работает как часы, вечером попробую в игре.

9 (изменено: skeleton, 2015-08-28 12:09:30)

Re: Одновременное нажатие клавиш в игре

~*sc11::
    sleep 1000
    shag:=0
    send {shift down}
return

Возможно как то прервать sleep если я отпутил W раньше 1000 мс? Чтобы дальше не выполнялось?

10 (изменено: yalanne, 2015-08-28 15:36:45)

Re: Одновременное нажатие клавиш в игре

Вот мой вариант, вроде как все стабильно работает:

#if !GetKeyState("LButton","P")
~*sc11::
KeyWait sc11,T1
If !ErrorLevel
    return
sendInput {shift down}
KeyWait sc11
return
~*sc11 up::
sendInput {shift Up}
return
#if GetKeyState("sc11","P")
~*LButton::sendInput {shift Up}
~*LButton Up::sendInput {shift Down}
#if

11 (изменено: Nikva, 2015-08-31 12:43:28)

Re: Одновременное нажатие клавиш в игре

+ Alectric
Alectric пишет:
GetKeyState("sc11", "P") ? 200:-1

Какой смысл в этом операторе, если цикл завершается при отпускании кнопки?
Результат всегда будет 200.

Да тут не имеет смысла.
Не обратил внимание, копировал с своего скрипта, в котором много таких проверок.

+ skeleton

skeleton пишет:
~*sc11::
    sleep 1000
    shag:=0
    send {shift down}
return

Возможно как то прервать sleep если я отпутил W раньше 1000 мс? Чтобы дальше не выполнялось?

Видел такой вариант решения на форуме:

~*sc11:: ; w
shag:=0
T:="" 
while GetKeyState("SC011","p")
{
    if (A_TickCount > T) and (T := A_TickCount + 1000)
        send {shift down}
    sleep 10
}
return