Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > AutoFire


Автор: p0s0l 27.7.2003, 14:41
В одной гаме надо часто нажимать пробел (раза 3-4 в секунду), меня это задолбало.
Поэтому я хотел написать прогу, имитурующую нажатие пробела.
Вот процедура таймера:

hnd := GetForegroundWindow;
PostMessage (hnd, WM_KEYDOWN, 32, $390001);
PostMessage (hnd, WM_KEYUP, 32, $C0390001);

И ничего не делается. WM_CHAR генерится автоматически.

В чем дело ? Еще чето надо делать ?

Автор: stab 27.7.2003, 16:03
игра наверно ипользует GetAsyncKeyState или GetKeyboardState или что-то подобное, попробуй SetKeyboardState или keybd_event, т.к. сообщения не устанавливают состояния клавиш...

Автор: p0s0l 27.7.2003, 18:23
Да вообще, даже не игра, вообще ничо на это не реагирует. Даже Дельфи, и сама прога тоже....
Сообщения приходят, я смотрел, но почему-то ничего не происходит.
Я вытащил на форму TEdit, туда поставил курсор - и нифига...

Автор: stab 27.7.2003, 18:26
может sndkey32.pas тебе поможет..., на компакте с дельфями поищи в папке Extras кажется

Автор: <Spawn> 28.7.2003, 05:48
Код

   ScanCode:=MapVirtualKey(Key,0);
   lParam := ScanCode shl 16 or 1;
   SendMessage(Wnd,WM_KEYDOWN,Key,lParam);

Автор: p0s0l 28.7.2003, 12:52
cully, спасибо за подсказку с sndkey32!

Я понял свою ошибку. sndkey32 работает через keybd_event, а не через сообщения. А keybd_event
посылает WM_KEYDOWN и WM_KEYUP текущему элементу активного окна, имеющему фокус (по-моему,
узнать хендл этого окна сложно).
А я посылал сообщения окну GetForegroundWindow - эта функция возвращает хэндл просто активного окна (формы),
а не его дочернего окна, имеющего фокус.

Сейчас всё работает с помощью sndkey32.pas, но только не в той гаме...

Автор: Гость_cully 28.7.2003, 13:38
в sndkey32 есть еще AppActivate. Перед тем как посылать нажатия надо сделать AppActivate('Заголовок нужного окна');

Автор: <Spawn> 28.7.2003, 14:25
Попробуй так (По крайней мере у меня сработало)
Код
PostMessage(Wnd,WM_KeyUp,VK_SPACE,0);

Автор: p0s0l 28.7.2003, 19:00
Ну сейчас в обычных приложениях работает и с помощью SendKeys и с помощью PostMessage.
Только вот в гаме-то не работает, видимо как сказал cully там работают через GetAsyncKeyState.
Так наверное уже не обмануть гаму...

Автор: stab 29.7.2003, 00:08
p0s0l может кинишь гаму, я пороюсь может что-нить нарою... или она здоровая больно?

Автор: p0s0l 29.7.2003, 01:57
cully - я тебе закинул, правда не знаю, получишь ли ты - у меня тут чо-то с мылом...

Еще: в той гаме можно и мышью стрелять, тоже пробовал с помощью PostMessage вроде WM_LMOUSEBUTTON - только никакой реакции. Если с клавой облом может быть из-за юзанья GetAsyncKeyState, то из-за чего может быть облом с мышью ?

Автор: stab 29.7.2003, 15:00
p0s0l, игра Direct Input использует, а он вроде почти на прямую общается с клавой и мышой, короче надо думать... smile.gif

Автор: stab 29.7.2003, 15:01
з.ы. p0s0l, ты не в курсе зачем это игра сокеты юсает? троян там походу какой-то или она в инет куда-то лазит.

Автор: p0s0l 29.7.2003, 17:21
сокеты - свои результаты можно кидать в инет.
DirectInput - значит облом, хотя игра то примитивнейшая...
ладно уж, буду палец тренировать...

Спасиб за советы!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)