1 (изменено: sergeant.coolagin, 2012-08-24 05:50:28)

Тема: AHK: Зажать кнопку и держать зажатой

Необходимо по нажатию одной кнопки зажать вторую кнопку и держать эту вторую кнопку зажатой до последующего нажатия первой кнопки. Жму первую кнопку один раз, нажимается вторая кнопка и держится зажатой. Нажимаю первую кнопку второй раз, вторая кнопка отпускается, жму первую кнопку третий раз, зажимается вторая, жму первую кнопку четвертый раз - отпускается вторая ну и т.д. Я пробовал по-разному, но не получается:

Joy9::
{
Send {I}
}
Return
Joy9 Up::
{
Send {I Up}
}
Return
Joy9::
{
Send {I Down}
}
Joy9 Up::
{
Send {I Up}
}
Return
Joy9::
{
Send {I}
KeyWait, Joy9
Send {I Up}
}
Return
Joy9::
{
Send {I Down}
KeyWait, Joy9
Send {I Up}
}
Return

Я пробовал использовать виртуальные коды клавиш, а так же использовать SendInput, SendPlay.
Пробовал использовать GetKeyState, While, if...
Но не получается правильно написать.
Я, кстати, не понимаю различия между if и while. Я не могу найти подробной справки про оператор while... Я гуглил, пытался найти на Сером форуме, autohotkey.com и т.д. Но не нашел. Нашел лишь разные семплы и программы... Скиньте, пожалуйста, ссылку на подробное описание оператора while.
Помогите, пожалуйста, корректно написать программу.

2

Re: AHK: Зажать кнопку и держать зажатой

Англоязычная справка.

BIG BROTHER IS WATCHING YOU.

3

Re: AHK: Зажать кнопку и держать зажатой

Если получится скинь пожалуйста код скрипта, тоже нужен подобный)

4 (изменено: KepocuH, 2012-08-24 10:31:21)

Re: AHK: Зажать кнопку и держать зажатой

Первое, что пришло в голову
Правда, не совсем то, что просили... Вторая кнопка не держится нажатой, а нажимается с определенными интервалами.


F =
 
1:: ;<-- первая кнопка
    F := !F
    SetTimer key2, 200 ;<-- задержка между нажатиями второй кнопки
return

key2:
    if F
        Send 2 ;<-- вторая кнопка
    else SetTimer key2, Off
return

5

Re: AHK: Зажать кнопку и держать зажатой

; vk57 - 1st, vk20 - 2nd

~vk57::
   Send, % "{vk20 "(!(IsState:=!IsState) ? "Up":"Down")"}"
   KeyWait, vk57
   Return
$vk57::
   Send, % "{vk57 Down}{vk20 "((IsState:=!IsState) ? "Down":"Up")"}"
   KeyWait, vk57
   Send, {vk57 Up}
   Return
$vk57::
   Send, % "{vk57 Down}{vk20 "(IsState ? "Up":"Down")"}"
   KeyWait, vk57
   Send, % "{vk57 Up}"IsState:=!IsState
   Return

6 (изменено: sergeant.coolagin, 2012-08-24 11:47:28)

Re: AHK: Зажать кнопку и держать зажатой

Grey пишет:
; vk57 - 1st, vk20 - 2nd

~vk57::
   Send, % "{vk20 "(!(IsState:=!IsState) ? "Up":"Down")"}"
   KeyWait, vk57
   Return
$vk57::
   Send, % "{vk57 Down}{vk20 "((IsState:=!IsState) ? "Down":"Up")"}"
   KeyWait, vk57
   Send, {vk57 Up}
   Return
$vk57::
   Send, % "{vk57 Down}{vk20 "(IsState ? "Up":"Down")"}"
   KeyWait, vk57
   Send, % "{vk57 Up}"IsState:=!IsState
   Return

Ни один из вариантов не работает.
По нажатию на кнопку "9" со включенным или выключенным CAPS LOCK'ом, Капс лок не включается и не выключается по нажатию кнопки 9. А вот кнопка 9 нажимается. Пробовал запускать от имени администратора. Пробовал изменять vk20 на другие виртуальные коды клавиш... Никакого результата.
Кодировка UTF-8.

7

Re: AHK: Зажать кнопку и держать зажатой

Grey пишет:
; vk57 - 1st, vk20 - 2nd

~vk57::
   Send, % "{vk20 "(!(IsState:=!IsState) ? "Up":"Down")"}"
   KeyWait, vk57
   Return
$vk57::
   Send, % "{vk57 Down}{vk20 "((IsState:=!IsState) ? "Down":"Up")"}"
   KeyWait, vk57
   Send, {vk57 Up}
   Return

Эти скрипты делают (у меня по крайней мере) при первом нажатии Send {vk57}{vk20}, при втором Send {vk57}.
И совершенно не делают Send {vk20 Down}... Непонятно.
Проверял в Notepad'е, если это имеет значение ))

8 (изменено: creature.ws, 2012-08-24 14:07:24)

Re: AHK: Зажать кнопку и держать зажатой

Необходимо по нажатию одной кнопки зажать вторую кнопку и держать эту вторую кнопку зажатой до последующего нажатия первой кнопки.

Joy9::
    If (flag := !flag)
        SetTimer, SendI, 40
    Else {
        SetTimer, SendI, Off
        SendInput {vk49 Up}
    }
    KeyWait Joy9
    return

SendI:
    SendInput {vk49 Down}
    return

Я не могу найти подробной справки про оператор while

не понимаю различия между if и while.

If — оператор ветвления, while — оператор цикла с предусловием.
Скрипт выполняется сверу вниз, натыкаясь на If интерпретатор попадает на распутье, и в зависимости от результата условия сворачивает в определённом направлении и продолжает выполнение. Натыкаясь на While интерпретатор проверяет истинность условия и выполняет обусловленные действия до тех пор пока условие не станет ложным. (Здесь можно было бы привести пример с «копать отсюда и до обеда», но надеюсь и так понятно)

9

Re: AHK: Зажать кнопку и держать зажатой

sergeant.coolagin пишет:

Ни один из вариантов не работает.

sergeant.coolagin пишет:

Никакого результата.

KepocuH пишет:

...Проверял в Notepad'е...

Я не знаю как там проверяете, я проверял в CS:S, там у меня W/Ц (vk57) - курсорная идти вперёд и присесть (vk20 он же пробел).

sergeant.coolagin пишет:

По нажатию на кнопку "9" со включенным или выключенным CAPS LOCK'ом, Капс лок не включается...

А это из какой "оперы"?

10

Re: AHK: Зажать кнопку и держать зажатой

Grey пишет:

Я не знаю как там проверяете, я проверял в CS:S, там у меня W/Ц (vk57) - курсорная идти вперёд и присесть (vk20 он же пробел).

sergeant.coolagin пишет:

По нажатию на кнопку "9" со включенным или выключенным CAPS LOCK'ом, Капс лок не включается...

А это из какой "оперы"?

Я всех виртуальных кодов клавиш не знаю, когда мне нужно узнать виртуальный код клавиш, то я пользуюсь вот такими сайтами:
Keycodes
Codes

vk57 - это ведь, вроде, десятичное значение, а не шестнадцатеричное. А vk57 в десятичном формате есть "9", а вот в шестнадцатеричном vk0x57 есть "W". Но, вообще, да, теперь я увидел, что имелось ввиду "vk0x57", и стоило попробовать и этот вариант, а я не попробовал. Но почему программа восприняла vk57 как шестнадцатеричное значение? Я всегда использовал и понимал  "vk##" как десятичное значение... И это работало. Раньше...

Сейчас буду пробовать все коды.

11

Re: AHK: Зажать кнопку и держать зажатой

Какой интересный ход мыслей Увы, не подкреплённый документально:

{vkXX}; {scYYY}; {vkXXscYYY} Sends a keystroke that has virtual key XX and scan code YYY. For example: Send {vkFFsc159}. If the sc or vk portion is omitted, the most appropriate value is sent in its place.
The values for XX and YYY are hexadecimal and can usually be determined from the main window's View->Key history menu item. See also: Special Keys