1 (изменено: Borodas, 2012-06-24 02:26:55)

Тема: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

Доброго времени суток Всем!
Попробовал написать свой первый скрипт , и неудачно.
Пытался решить вопрос самостоятельно используя документацию по программе AHK
эту: http://script-coding.com/AutoHotkey/Hotkeys.html
и вот эту:http://script-coding.com/AutoHotkey/Macro.html
Но там описано применение горячих клавиш типа: Ctrl, Alt и т.д., символов, комбинации клавиш типа Ctrl+ Alt+S и т.д.
Но к сожалению я не нашел там каким образом можно задействовать "чистые" клавиши букв т.е. не комбинацию.
Теперь суть :
   В игре необходимо нажать на клавишу {I} (открывается рюкзак)
   Далее переместить курсор в указанные координаты и сделать двойной клик (т.е. использовать)
   Далее снова закрыть рюкзак т.е. снова нажать на клавишу I
   Все!   (Думал все просто!)
Горячей(пусковой) клавишей назначал RControl.(т.к. опять таки не нашел как можно задействовать кнопку на колесике мышки).
Сначала для записи попробовал использовал AutoScriptWriter II (думал запишу, и удалю все лишнее    ! НО не тут-то было!)
И вот чего у меня получилось :

WinWait, , 
IfWinNotActive, , , WinActivate, , 
WinWaitActive, , 
MouseClick, left,  671,  753
Sleep, 100
{CTRLUP}
WinWait, Диспетчер задач Windows, 
IfWinNotActive, Диспетчер задач Windows, , WinActivate, Диспетчер задач Windows, 
WinWaitActive, Диспетчер задач Windows, 
Send, {ALTDOWN}{CTRLDOWN}{ALTUP}{CTRLUP}.{ALTDOWN}{CTRLDOWN}{ALTUP}{CTRLUP}
Sleep, 100

В коде выше я не увидел эмуляции нажатия на  клавишу Ш (или I).Часть кода:

{CTRLUP}
WinWait, Диспетчер задач Windows, 
IfWinNotActive, Диспетчер задач Windows, , WinActivate, Диспетчер задач Windows, 
WinWaitActive, Диспетчер задач Windows, 
Send, {ALTDOWN}{CTRLDOWN}{ALTUP}{CTRLUP}.{ALTDOWN}{CTRLDOWN}{ALTUP}{CTRLUP}
Sleep, 100

Эту часть я удалял т.к. жал её для выхода из экрана игры на раб.стол. (что-бы остановить запись).
К стати вопрос: возможно-ли запустить AutoScriptWriter II непосредственно в окне самой игры, и записать там скрипт ???
Переделывал и остальную часть кода, пробовал по разному, но результат один - не работает! Рюкзак не открывается вообще! Курсор смещается, но проконтролировать правильно-ли нет возможности.
Далее попробовал написать в ручную вот чего получилось:

RControl::

SendKeys: 
    Send {i} {Raw}
    IfWinNotActive, , , WinActivate, ,  
    Sleep 100
    MouseClick, left,  84,  287
    MouseClick, left,  84,  287
    Sleep 100
    Send {i}{Raw}
    Return

Что не так???
P.S. Координаты курсора отличаются по значению почему-то. В первом случае записывал AutoScriptWriter II
Во втором : входил в игру, перемещал курсор в необходимое место, клеил на монитор кусок бумажки,
выходил из игры, и с помощью проги Auto IT3 WindowSpy вычислял координаты курсора стоящего под наклейкой.
Буду весьма признателен за оказанную помощь.

2

Re: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

Что не так???

RControl::
    Send {i}
    Sleep 100
    MouseClick, left,  84,  287, 2
    Sleep 100
    Send {i}
    Return

Правильный ответ на ваши вопросы — продолжайте читать справку и разбирать существующие примеры скриптов.

3 (изменено: Borodas, 2012-06-24 10:34:16)

Re: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

Уважаемый creature.ws.
Я ОЧЕНЬ БЛАГОДАРЕН ВАМ  за участие в решении моих проблем, НО!
К сожалению проблема не решена . Подобный скрипт я пробовал, разница лишь в строке:

MouseClick, left,  84,  287, 2

Я не ставил 2 после координат.
Суть в том, что в игре вот именно значение

Send {i}

как раз и НЕ срабатывает! Как я и писал выше .
То есть  НЕТУ нажатия на кнопку I !!!
Что-то не так.    Ковыряю дальше ,не знаю получится-ли чего -нибудь. 

4

Re: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

Попробуйте вместо именного названия хоткея (RControl) прописать скан-код этой клавиши:

sc11D::
   Send, {sc17} ; i/ш
   Sleep, 100
   ...

5

Re: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

Спасибо! ЕСТЬ сдвиг!
Клавиша {I} стала нажиматься!НО!
Теперь проблема с курсором, он ведет себя как-то не стабильно, его перемещает то в верхний левый угол(ближе к нулю координат),то в нижний левый угол.
Что-то неверно с координатами?

6

Re: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

На пример в Counter Strike: Source пробую такой тестовый код:

CoordMode, Mouse
RControl::MouseMove, 50, 50,, R

При наличии консоли на экране, т.е. DirectDraw режим - всё работает корректно, курсор сдвигается относительно своего положения в указанные координаты, стоит только убрать консоль, т.е. переключиться в режим Derict3D, то курсор упирается в пол, либо в потолок. Вышел из полноэкранного режима, запустил в оконном, чтобы поверх приложения игры отрисовывался туллтип с координатами курсора (запустил ещё код). Так явным образом видно, что как-бы не двигать курсор, его координаты всегда равны середине экрана (при нажатии хоткея сбиваются, но очень быстро возвращаются на исходные). Если Ваш рюкзак отображается как D3D часть игры, то попасть на него стандартной коммандой для мыши из функционала АХК думаю будет проблематично. Есть вариант задействовать WinAPI функцию mouse_event, примеров использования довольно таки много, стоит вбить в фильтр поиска строку вида - "DllCall("mouse_event", ".

7 (изменено: Borodas, 2012-06-25 14:50:33)

Re: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

Grey пишет:

Если Ваш рюкзак отображается как D3D часть игры, то попасть на него стандартной коммандой для мыши из функционала АХК думаю будет проблематично. .

Прискорбно.
Чувствую решение придет не скоро.

Grey пишет:

Есть вариант задействовать WinAPI функцию mouse_event, примеров использования довольно таки много, стоит вбить в фильтр поиска строку вида - "DllCall("mouse_event", ".

Это для меня ещё не знакомо.    Иду искать.
P.S. Подобный макрос написанный для игровой мыши работает, но хотелось-бы найти более уникальное и стабильное решение (ведь не у всех есть возможность приобрести такую мышь).Да и работа макросов написанных для нее оставляет желать лучшего.

8 (изменено: Borodas, 2012-06-25 14:49:41)

Re: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

Вот почитал, поискал и наткнулся на написанный Вами Grey скрипт: http://forum.script-coding.com/viewtopic.php?id=6076
Цитирую:

LButton::DllCall("mouse_event", UInt, 0x0001 ; вариант второй
                                 , Int, 0
                                 , Int, 250
                                 , UInt, 0
                                 , Int, 0)
LButton Up::DllCall("mouse_event", UInt, 0x0001
                                 , Int, 0
                                 , Int, -250
                                 , UInt, 0
                                 , Int, 0)

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

sc11D::
    Send {sc17} ; i/ш
    Sleep 100
    DllCall("mouse_event", UInt
                                , Int, 0
                                , Int, 250
                                , UInt, 0
                                , Int, 0)
    DllCall("mouse_event", UInt
                                 , Int, 0
                                 , Int, -250
                                 , UInt, 0
                                 , Int, 0)
    Sleep 100
    Send {sc17} ; i/ш
    Return

В полученном таким образом коде рюкзак открывается (это есть +), курсор остается стоять на месте(это тоже +), минусом является тот факт что сразу после респауна (рождения тела игрока) необходимо один раз открыть рюкзак и навести курсор на аптеку (на том месте он и останется стоять до тех пор пока игрока не "убьют" ) НО это можно терпеть! И еще один минус в том что нет двойного клика (т.е. курсор-то стоит на аптеке но не использует ее). Не уверен что сделал все правильно но это работает   . Остается добавить в скрипт двойной клик.

9

Re: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

Borodas, если вы пишите на AHK_L, то последний параметр должен иметь тип указателя("ptr").

Borodas пишет:

И еще один минус в том что нет двойного клика

DllCall("mouse_event", UInt, 0x0001, Int, 0 , Int, 250 , UInt, 0 , Int, 0)
Почему там именно единица? Что будет, если изменить на двойку или четвёрку?

10 (изменено: Borodas, 2012-06-25 18:50:20)

Re: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

Александр_ пишет:

Borodas, если вы пишите на AHK_L, то последний параметр должен иметь тип указателя("ptr").
DllCall("mouse_event", UInt, 0x0001, Int, 0 , Int, 250 , UInt, 0 , Int, 0)
Почему там именно единица? Что будет, если изменить на двойку или четвёрку?

Немного не понял цели Ваших вопросов , если Вы хотите доказать лишний раз мне и окружающим что я НЕ программист; то я должен Вам ответственно заявить (если Вам не надоело это читать) НЕТ я только пытаюсь
развиваться в этом направлении, я новичок , я ... и.т.д.
Если Вы хотите помочь буду ВЕСЬМА признателен за ЛЮБУЮ оказанную помощь.
1. Я ПЫТАЮСЬ писать на AHK (не AHK_L) .
2. Переделал, так лучше?
   

Вчера изучал Ваш форум успел прочитать к сожалению всего 6 страниц  с темами и 2 страницы в ветке 
"Коллекция скриптов и идей » AutoHotkey", и честно говоря, был поражен тем колоссальным трудом,
и той оперативностью с которой работают те процентов 5  от общей численности людей зарегистрированных на этом форуме. Жаль что у Вас на форуме нет  кнопочки "спасибо" .

11

Re: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

Извините за задержку, не заметил последнего ответа.

Borodas пишет:

Немного не понял цели Ваших вопросов , если Вы хотите доказать лишний раз мне и окружающим что я НЕ программист; то я должен Вам ответственно заявить (если Вам не надоело это читать) НЕТ я только пытаюсь
развиваться в этом направлении, я новичок , я ... и.т.д.

Это было указание на то, что вам нужно более подробно изучить функцию mouse_event.

Borodas пишет:

Если Вы хотите помочь буду ВЕСЬМА признателен за ЛЮБУЮ оказанную помощь.
1. Я ПЫТАЮСЬ писать на AHK (не AHK_L) .
2. Переделал, так лучше?

1. Зря, переходите на AHK_L, обычной версией тут никто не пользуется- она сильно устарела.
2. Нет, хуже. Ничего переделывать не нужно, нужно понять почему именно эти данные передаются в функцию. Чуть раньше Grey дал ссылку на MSDN. Там написано:

MSDN пишет:

MOUSEEVENTF_MOVE   Movement occurred.
0x0001

Там же указаны и другие возможные флаги, например:

MSDN пишет:

MOUSEEVENTF_LEFTDOWN     The left button is down.
0x0002
MOUSEEVENTF_LEFTUP     The left button is up.
0x0004

как с их помощью двойной клик составить, я думаю, вы догадались.

12

Re: AHK: скрипт на нажатие кнопок клавиатуры, и перемещение мыши в игре

Прошу прощения за длительное отсутствие - по работе необходимо было уехать из города,
возможности ответить не было .
1.Дело в том, что AHK_L 
А). у меня нет в наличии
Б). я, как вы наверное догадались совсем новичок в написании скриптов (повторяюсь) и только-только начал немного (с помощью Вашего форума,конечно) чего-то там ОТДАЛЕННО соображать в этом, и не успев толком разобраться с AHK перепрыгивать на AHK_L  , боюсь у меня возникнет СЛИШКОМ много вопросов , а читать англоязычные ссылки по мануалу мне не совсем комфортно, учитывая тот фактор что они не совсем корректно переводятся переводчиком,и приходится чего-то там додумывать . К стати вопрос: в чем выигрывает AHK_L ?? Если только более красивым интерфейсом, то это не основание для перемен (ИМХО).
2.Еще раз  извиняюсь, но по найденным и прочитанным мною ссылкам я ,к сожалению, толком так и не разобрался в командах "mouse_event" и тем более в значениях флагов , экспериментальным путем определил только то, что при изменении значения флага( на 2 или 4) никаких видимых изменений НЕ происходит! , так-же как и при удалении этого значения совсем. Потому и "переделал".
Примечательно то, что скрипт работает, и (пока) непонятным мне способом выполняет требуемую от него задачу!
3.Двойной клик добавил, но сомневаюсь что добавил правильно, и корректно, потому и не выкладываю.
P.S.Если кто-то со мной не согласен, имеет другое мнение или варианты, буду рад  ознакомится. Но прошу не пинайте жестко, к сожалению гениями рождаются не все . Но при определенном желании и настойчивости можно приблизится к нему (ИМХО).