HLFX.Ru Forum
Показать все 36 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- эмуляция нажатия (https://hlfx.ru/forum/showthread.php?threadid=2049)


Отправлено BioHazard 06-01-2010 в 20:36:

эмуляция нажатия

Прошу помощи с написанием мини программки, которая отслеживала бы состояние определенной кнопки (нажата/не нажата) и эмулировала бы нажатия этой кнопки энное количество раз пока нажата сама кнопка.. как только кнопка отпускается, цикл останавливается..
Проблема еще и в том, чтобы кнопка "нажималась" даже если кроме нее нажато что то еще..


Отправлено XaeroX 06-01-2010 в 21:13:

BioHazard проведи простой эксперимент. Поставь курсор в форму быстрого ответа, нажми, скажем, кнопку "пробел" и не отпускай. В нее начнут ставиться пробелы. Как только кнопка отпускается, цикл останавливается.
То есть, это как бе уже есть в Винде...

__________________

xaerox on Vivino


Отправлено Дядя Миша 06-01-2010 в 21:15:

Цитата:
XaeroX писал:
То есть, это как бе уже есть в Винде...

я больше скажу - скорость автоповтора можно настроить аж в биосе.
То есть это на аппаратном уровне заложено и будет работать везде.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено BioHazard 06-01-2010 в 21:44:

дело в том, что это нужно реализовать в одной игре... Доступа к сорцам нету, а зажав пробел прыгнет он там всего 1 раз =| поэтому и хочу прибегнуть к помощи извне..


Отправлено Дядя Миша 06-01-2010 в 22:26:

BioHazard ну так ты запоминай што пробел зажат и генерь оттуда хаатычные импульсы, пока кнопку не отпустят. Делов-то.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено BioHazard 07-01-2010 в 13:19:

т.е. весь код это 6-7 строк условие+цикл? оке, стартуем


Отправлено Дядя Миша 07-01-2010 в 13:56:

BioHazard цыкл общий юзай
додумался блин.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено SiPlus 07-01-2010 в 18:23:

Есть программа AutoHotkey для этих дел


Отправлено BioHazard 07-01-2010 в 19:24:

Цитата:
SiPlus писал:
Есть программа AutoHotkey для этих дел

не вариант, ибо при нажатии какой нибудь другой клавиши цикл прекращается..

щя винапи поковыряем


Отправлено Дядя Миша 07-01-2010 в 20:21:

BioHazard я тебя научу.
Заведи массив для всех кнопок и храни там их состояние.
Допстим пришел импульс на то что кнопка G нажата.
пишешь в массив труе напротив G.
В общем цикле проверяешь нажатые кнопки и генеришь для них импульсы с определенной переодичностью. Тебе понадобится еще массив для хранения времени, прошедшего с момента нажатия кнопки.
Как только кнопка отжимается - приходит импульс, обнуляешь состояние конкретной кнопки. Тривиальная задачка, работы на час.
И то больше времени на создание нового проекта уйдет.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено BioHazard 08-01-2010 в 14:13:

ну с этим понятно, мне бы сначала узнать как в винде состояние кнопки узнать и как ее передавать в любое активное окно..


Отправлено XaeroX 08-01-2010 в 15:29:

GetAsyncKeyState
SendMessage(WM_KEYDOWN)
SendMessage(WM_CHAR)
SendMessage(WM_KEYUP)

__________________

xaerox on Vivino


Отправлено BioHazard 08-01-2010 в 15:31:

:>>> спасибо :>


Отправлено BioHazard 10-01-2010 в 00:07:

с горем пополам разобрался с винапи, скомпилил, но вот мессагу в окно он упорно не хочет отправлять..
да и сам цикл по нажатии не начинается, а наоборот завершает процесс.. Если поменять местами true и false то наоборот, сразу с запуска начинается цикл, но стоит нажать кнопку он остановится =\
хотелось бы еще узнать о чтении флажков в командной строке, типа bhop.exe -shift -50... Без "-" то знаю что через argv[], но значения их него все равно в просто не сохранить в качестве переменной..

C++ Source Code:
1
#include "stdafx.h"
2
#include "fstream.h"
3
#include "windows.h"
4
void bhop(void)
5
{
6
  SendMessage(GetForegroundWindow(), WM_KEYDOWN, VK_SPACE, NULL);
7
  SendMessage(GetForegroundWindow(), WM_CHAR, VK_SPACE, NULL);
8
  SendMessage(GetForegroundWindow(), WM_KEYUP, VK_SPACE, NULL);
9
}
10
 
11
void main()
12
{
13
  do
14
  {
15
    while(GetAsyncKeyState(VK_SPACE) == true)
16
      bhop();
17
  }
18
  while(GetAsyncKeyState(VK_SPACE) == false);
19
}


Отправлено Дядя Миша 10-01-2010 в 11:59:

Цитата:
BioHazard писал:
SendMessage(GetForegroundWindow(), WM_KEYDOWN, VK_SPACE, NULL);
SendMessage(GetForegroundWindow(), WM_CHAR, VK_SPACE, NULL);
SendMessage(GetForegroundWindow(), WM_KEYUP, VK_SPACE, NULL);

Вот это што за ужос такой
А если бы тебе Ксерокс написал "МаоЦзедун" ты бы в коде тоже написал "МаоЦзедун" ?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено BioHazard 10-01-2010 в 14:20:

а разве он что то не правильно сказал? я полистал немного, вроде бы действительно можно отправлять мессагу в окно, через SendMessage или PostMessage .. Тут уже я чото налепил, не люблю винапи :S Прошу уж подсказать как тут быть..


Отправлено Дядя Миша 10-01-2010 в 14:25:

BioHazard выкинь среднюю мессагу нафиг. Не нужна она.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено BioHazard 10-01-2010 в 15:25:

убрал, но я не понимаю почему процесс завершается как только я нажму на нужную кнопку
Вместо мессаг ставил просто cout, дабы посмотреть как оно там работает, оказывается проблема в самом цикле.. Хотя даже наверное не в самом цикле, а в GetAsyncKeyState(VK_SPACE).. То ли я не правильно что то указал, то ли она не хочет возвращать false что конечно маловероятно..


Отправлено Дядя Миша 10-01-2010 в 16:32:

BioHazard да ты посмотри как в квейке устроено
Там маленький цикл, который считывает все пришедшие мессаги.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 10-01-2010 в 16:35:

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

__________________

xaerox on Vivino


Отправлено Дядя Миша 10-01-2010 в 18:37:

У меня такое ощущние - наугад как ночью по тайге.
Человек задает совершенно посторонние вопросы, мы ему даем совершенно посторонние ответы, а в конце он напишет - спасибо все получилось. Вот и думай что это было.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 10-01-2010 в 18:43:

Дядя Миша
Главное, чтобы у автора получилось.

__________________

xaerox on Vivino


Отправлено BioHazard 10-01-2010 в 19:01:

тык я спасибо написал за то что сказали куда копать..
А по делу - делов то, подправить цикл и разобраться с мессагами


Отправлено BioHazard 13-01-2010 в 16:22:

ну помогите хотябы с отправкой мессаги


Отправлено Дядя Миша 13-01-2010 в 17:10:

BioHazard да ты хотябы код покажы. Только не в теге, а вложением, блин.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено BioHazard 13-01-2010 в 19:51:

к стати, это правда, что GetAsyncKeyState() можно использовать только в win32 оконном приложении?Я же делал консольным, поэтому наверное и не получалось, т.к. точка входа там через WinMain().. В общем тут я вообще не знаю поэтому прошу подправить если что..

------------------------------------------

еще хотелось бы спросить, как считывать параметры запуска программы? например bhop.exe -space ?
Пробовал через char argv[], но передать параметры в GetAsyncKeyState() из нее у меня не получалось =/


Отправлено Дядя Миша 13-01-2010 в 21:08:

BioHazard это не код, а гамно какое-то. Тут все переделывать надо.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено BioHazard 13-01-2010 в 21:43:

не спорю. вот и прошу помощи..


Отправлено BioHazard 14-01-2010 в 15:16:

Со считыванием состояния кнопки разобрался. Остался вопрос с отправкой мессаги в окно.. Мессага в окно не отправляется вообще =(


Отправлено XaeroX 14-01-2010 в 15:41:

Во-первых, посмотри внимально МСДН. Я смотрю, ты лихо поставил четвертый параметр в 0 в обоих вызовах.
Во-вторых, вот почитай:

Цитата:
Вот как работает SendMessage. Если поток вызывает SendMessage для посылки со-
общения окну, созданному им же, то функция просто обращается к оконной процедуре соответствующего окна как к подпрограмме. Закончив обработку, оконная процедура передает функции SendMessage некое значение, а та возвращает его вызвавшему потоку.

Однако, если поток посылает сообщение окну, созданному другим потоком, операции, выполняемые функцией SendMessage, значительно усложняются. Windows требует, чтобы оконное сообщение обрабатывалось потоком, создавшим окно. Поэтому, если вызвать SendMessage для отправки сообщения окну, созданному в другом процессе и, естественно, другим потоком, Ваш поток не сможет обработать это сообщение — ведь он не работает в адресном пространстве чужого процесса, а потому не имеет доступа к коду и данным соответствующей оконной процедуры. И действительно, Ваш поток приостанавливается, пока другой поток обрабатывает сообщение. Поэтому, чтобы один поток мог отправить сообщение окну, созданному другим потоком, система должна выполнить следующие действия.

Во-первых, переданное сообщение присоединяется к очереди сообщений потока-приемника, в результате чего для этого потока устанавливается флаг QS_SENDMESSAGE. Во-вторых, если поток-приемник в данный момент выполняет какой-то код и не ожидает сообщений (через вызов GetMessage, PeekMessage или WaitMessage), переданное сообщение обработать не удастся — система не прервет работу потока для немедленной обработки сообщения. Но когда поток-приемник ждет сообщений, система сначала проверяет, установлен ли флаг пробуждения QS_SENDMESSAGE, и, если да, просматривает очередь синхронных сообщений, отыскивая первое из них. В очереди может находиться более одного сообщения. Скажем, несколько потоков одновременно послали сообщение одному и тому же окну. Тогда система просто ставит эти сообщения в очередь синхронных сообщений потока.

Итак, когда поток ждет сообщений, система извлекает из очереди синхронных сообщений первое и вызывает для его обработки нужную оконную процедуру. Если таких сообщений больше нет, флаг QS_SENDMESSAGE сбрасывается. Пока поток-приемник обрабатывает сообщение, поток, отправивший сообщение через SendMessage, простаивает, ожидая появления сообщения в очереди ответных сообщений. По окончании обработки значение, возвращенное оконной процедурой, передается асинхронно в очередь ответных сообщений потока-отправителя. Теперь он пробудится и извлечет упомянутое значение из ответного сообщения. Именно это значение и будет результатом вызова SendMessage. С этого момента поток-отправитель возобновляет работу в обычном режиме.

__________________

xaerox on Vivino


Отправлено BioHazard 14-01-2010 в 18:21:

так получается, не получится передать сообщение в игровое окно пока там не будет ожидаться ввода?
lParam: Longint что можно передать в этом параметре?

вообще запутался

можно ли как нибудь не используя SendMessage сэмулировать нажатие?

Добавлено 14-01-2010 в 21:21:

кстати, если сообщение не было отправлено, то функция должна вернуть 0?


Отправлено Дядя Миша 14-01-2010 в 19:13:

BioHazard да идиж ты msdn читай. Он уже давно на русском.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено BioHazard 15-01-2010 в 20:36:

тут я уже бессилен.. мессага спокойно передается с помощью keybd_event в игру в консоль, а вот выйдя из консоли прыгать он отказывается =/ ну что мне еще сделать уффф...


Отправлено Дядя Миша 15-01-2010 в 21:14:

BioHazard сделай бочку

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено AlMod 16-01-2010 в 20:53:

Чуть позже напишу как сделать

__________________
Сайт поддержки кодеров на AMX Mod X


Отправлено BioHazard 17-01-2010 в 01:07:

хех, спасибо :>


Временная зона GMT. Текущее время 12:49.
Показать все 36 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024