1 (изменено: Glebis, 2010-03-27 12:09:37)

Тема: AHK: Несколько вопросов по работе горячих клавиш и Sent режимов

С основными функциями программы AHK, и вопросов не имею. Но вот чем больше я копаюсь с назначением горячих клавиш, тем меньше чего понимаю. Поэтому прошу знатоков подтвердить или исправить сделанные мною выводы.

1) Почему НИГДЕ не сказано, что при ФИЗИЧЕСКОМ удержании клавиши начинается её автоповтор. Я целый день долбался, пытаясь выяснить причину, почему скрипт тормозит безбожно при активации-удержании хоткея. Авторы скорее всего считают, что конечный пользователь сам должен до этого догадаться.
1а) Как точно ведёт себя системный автоповтор клавиш при их ВИРТУАЛЬНОМ удержании разными режимами Sent команд? Тут я разобраться никак не могу.

2) из описания SendInput и SendPlay:
2а) "Кроме того они буферизуют физические нажатия на клавиши и кнопки мыши..." - в какой буфер буферизирует -в буфер физ. нажатий?. Что дает эта буферизация - последовательность нажатий вместо одновременности?
2б)" которые происходят во время посылки," - как я понимаю, буферизация ФИЗ нажатий ведётся ТОЛЬКО при ВИРТУАЛЬНЫХ нажатиях командами SendInput или SendPlay? Во всех остальных случаях ФИЗ нажатия не буферизируются.
2в) " что не позволяет нажатиям пользователя смешиваться с теми, которые посылает скрипт. ". Как я понимаю, виртуальный буфер перекрывает физический? А после опустошения виртуального выполняются команды из очереди команд физического буфера.
2г) #MaxThreadsBuffer off - какой буфер отключает эта команда: физический или виртуальный? Как я понял отключается виртуальный и работает только физический, и то ТОЛЬКО при использовании SendInput или SendPlay.

3)При включении режима CapsLock (физ или вирт способом), постоянно отсылается команда {CapsLock down}?

4) Пример:

ф::
msgbox 1
Return

~ф & в::
msgbox 2
Return

4а) Почему "ф" команда отсылается активному окну, если перед ней нет "~". Почему нужно перелапачивать весь код "а вдруг где есть ~ф"
4б) Почему "msgbox 1" срабатывает при ОТПУСКАНИИ "ф", а не при нажатии?
Где об этом написано? После таких сюрпризов нелестные слова в адрес разработчиков и HELPописателей вырываются сами собой...

2 (изменено: teadrinker, 2010-03-27 17:51:39)

Re: AHK: Несколько вопросов по работе горячих клавиш и Sent режимов

Glebis пишет:

1) Почему НИГДЕ не сказано, что при ФИЗИЧЕСКОМ удержании клавиши начинается её автоповтор.

Как это не сказано? Вот здесь разве не по-русски написано:

Keystroke Messages

Pressing a key causes a WM_KEYDOWN or WM_SYSKEYDOWN message to be placed in the thread message queue attached to the window that has the keyboard focus. Releasing a key causes a WM_KEYUP or WM_SYSKEYUP message to be placed in the queue.

Key-up and key-down messages typically occur in pairs, but if the user holds down a key long enough to start the keyboard's automatic repeat feature, the system generates a number of WM_KEYDOWN or WM_SYSKEYDOWN messages in a row. It then generates a single WM_KEYUP or WM_SYSKEYUP message when the user releases the key.

Это системная установка, AHK здесь не при чём.

Glebis пишет:

1а) Как точно ведёт себя системный автоповтор клавиш при их ВИРТУАЛЬНОМ удержании разными режимами Sent команд? Тут я разобраться никак не могу.

Почему не можешь? Попробуй разные режимы.

Glebis пишет:

2) ... (дальше много текста, ниасилил) ...

Просто напиши, какое поведение ты хотел бы получить.

Glebis пишет:

3)При включении режима CapsLock (физ или вирт способом), постоянно отсылается команда {CapsLock down}?

Нет, просто включается режим CapsLock.

Glebis пишет:

4а) Почему "ф" команда отсылается активному окну, если перед ней нет "~".

"ф" команды не существует, вопрос не ясен. Кроме того, меня возникает подозрение, что ты не вполне понимаешь действие значка "~".

Glebis пишет:

4б) Почему "msgbox 1" срабатывает при ОТПУСКАНИИ "ф", а не при нажатии?

Читай внимательно статью Горячие клавиши для мыши, джойстика и клавиатуры. В параграфе Возможности горячих клавиш, доступные только в Windows не ниже NT, 2K и XP:

Вы можете задать произвольную комбинацию из двух клавиш (кроме кнопок джойстика), если поставите между ними символ "&". В следующем примере для того, чтобы запустить горячую клавишу, удерживая Numpad0, нажмите вторую клавишу:

Numpad0 & Numpad1::MsgBox Вы нажали Numpad1, удерживая Numpad0.
Numpad0 & Numpad2::Run Notepad

В приведенном примере клавиша Numpad0 становится префиксной клавишей. Для префиксных клавиш также можно задать выполнение собственных операций, как показано в следующем примере, однако эти операции будут запущены только после того, как такая клавиша уже отпущена, и если в тот момент, когда вы начали ее нажимать, не были нажаты другие клавиши:

Glebis пишет:

Где об этом написано? После таких сюрпризов нелестные слова в адрес разработчиков и HELPописателей вырываются сами собой...

Ну, ты понял!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Несколько вопросов по работе горячих клавиш и Sent режимов

2teadrinker: используйте родной адрес сайта «http://www.script-coding.com» — он уже работает, а то я вижу в ссылках альтернативный адрес (поправил в посте выше).

4

Re: AHK: Несколько вопросов по работе горячих клавиш и Sent режимов

Да, забыл сменить.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Glebis, 2011-01-19 13:59:13)

Re: AHK: Несколько вопросов по работе горячих клавиш и Sent режимов

Извините меня за некропостинг, но не очень хочется создавать ещё одну тему с моими примитивными вопросами..

Я ломаю голову над задачами с элементарно простыми алгоритмами решения, но AHK интерпретируется действия алгоритма непонятным для меня образом. И чем больше пытаюсь понять интерпритатор, тем всё больше вопросов у меня возникает.

Иногда при интенсивном стрейфе в FPS играх из-за моей закоренелой привычки я могу одновременно удерживать нажатыми клавиши стрейфа A и D. И разные игры по разному это интерпритируют, зачастую не очень удачным образом.

Поэтому пытаюсь сделать такой скрипт:
Из 2х кнопок Ф и В (A и D) одновременно должна считаться нажатой ТОЛЬКО одна: та что нажата последней.
При отпускани одной из кнопок проверять, зажата ли физически вторая кнопка; если да то логически нажать её максимально похоже на сию секундное физическое нажатие. В частности должен заработать системный автоповтор клавиши, иначе игра может пропустить логическое нажатие.
Шапка:

Process, Priority, , H    ;повышенный приоритет программы
SetBatchLines -1        ;повышение производительности
#NoEnv            ;повышение производительности
#UseHook On        ;            
#InstallKeybdHook        ;
#InstallMouseHook        ;
#SingleInstance Force    ;только одна копия программы
#Persistent        ;постоянное выполнение
#MaxThreads 20        ;чтоб не вылетало на раб. стол
#MaxThreadsPerHotkey 200    ;чтоб не вылетало на раб. стол
#MaxHotKeysPerInterval 500;чтоб не вылетало на раб. стол
#MaxThreadsBuffer off    ;отключение буфера послед-ти нажатых клавиш
;#WinActivateForce    ;активация программы принудительно (не нужно)
CoordMode, Mouse, Screen    ;отн. координаты
SendMode InputThenPlay    ;метод send по умолчанию, самый универсальный

Вариант 1:

~*$в::
Send {ф up}{в down} ;пробывал разделять send команды sleep`ами...
Keywait, в, L
if GetKeyState("ф", "P")
Send {ф down}
Return

~*$ф::
Send {в up}{ф down}
Keywait, ф, L
if GetKeyState("в", "P")
Send {в down}
Return

Вариант 2:

~*$в::
Send {ф up}{в down}
Return

~*$ф::
Send {в up}{ф down}
Return

~*$в up::
Send {в up}
if GetKeyState("ф", "P")
Send {ф down}
Return

~*$ф up::
Send {ф up}
if GetKeyState("в", "P")
Send {в down}
Return

Я перепробывал кучу вариантов: с использованием хоткеев "~ф & в", тыкал sleepы повсюду,разделял send команды, разные sendmode, hotket offы. Но всерано команды Send {клавиша up}, как я понимаю, перекрывались из за системного автоповтора физически нажатой клавиши.

Прошу вашей помоши, ибо мой мозг больше ничего не может придумать против автоповтора. Поиск по форуму "автоповтор" тоже ничего путнего не выдаёт...

Нужно также упомянуть: проверяя работу скрипта в текстовом редакторе все происходит довольно логично; работает автоповтор последней нажатой клавиши. А, например, игра Battlefield 2 игнорирут все возможные вариации команды Send {клавиша up} (как и 2 приведённых мною способа), если эта клавиша удерживается физически.:/

6

Re: AHK: Несколько вопросов по работе горячих клавиш и Sent режимов

Автоповтор у Вас пропускают тильды (~), а также #MaxThreadsPerHotkey 200.

7 (изменено: Glebis, 2011-01-19 14:04:35)

Re: AHK: Несколько вопросов по работе горячих клавиш и Sent режимов

YMP пишет:

Автоповтор у Вас пропускают тильды (~), а также #MaxThreadsPerHotkey 200.

Тогда я не могу понять, почему не раобтает Send {клавиша up}, если эта клавиша нажата физически?
Либо это какая-то особенность режима InputThenPlay?

8

Re: AHK: Несколько вопросов по работе горячих клавиш и Sent режимов

Потому и не работает, вероятно. Автоповтор же постоянно шлёт {клавиша down}, которые благодаря тильдам проходят в окно игры мимо скрипта.

9 (изменено: Glebis, 2011-01-19 15:51:33)

Re: AHK: Несколько вопросов по работе горячих клавиш и Sent режимов

YMP пишет:

Потому и не работает, вероятно. Автоповтор же постоянно шлёт {клавиша down}, которые благодаря тильдам проходят в окно игры мимо скрипта.

Это мне понятно. Но если убрать ~, что уберёт автоповтор и, соответственно, перкратит команды Send {клавиша down}, тогда хот кеи не будут отправляться в активное окно...

10

Re: AHK: Несколько вопросов по работе горячих клавиш и Sent режимов

Так Вам в активное окно надо, я так понимаю, а не в определённое. Send это и делает.

11

Re: AHK: Несколько вопросов по работе горячих клавиш и Sent режимов

YMP пишет:

Так Вам в активное окно надо, я так понимаю, а не в определённое. Send это и делает.

Перечитал матчасть и примеры, переосмыслил значение значка ~, стало многое понятно...
Спасибо Вам, YMP, за то что указали где мне "копать".