Как вызвать программное нажатие клавиши в играх?

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
MaxmaD
Сообщения: 23
Зарегистрирован: 07 авг 2004, 13:38

Разобрался как эмулировать нажатие кнопок мыши.
Не могу на кнопку джойстика прописать нажатие клавиши с клавиатуры. Например при нажатии на кнопку джойстика происходит нажатие клавиши вверх (VK_UP). Проблема в том, что практически (но не во всех) во всех играх не происходит никакого действия.
А в программах и в самом windows нажатие происходит (передвигается скролинг, каретка в блокноте с какого места можно писать...).

Использовал много вариантов таких как:
keybd_event(VK_UP, 0, 0, 0);
keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);
...
Искал во многих местах, но что бы работало с играми не нашёл.


Ещё интересно как можно просто вызвать состояние зажатой клавиши.

ОС: Windows, Среда программирования: Delphi7.
P.S. Заранее благодарен.
Грязь под ногами бродяг, чище чем фальшь сладких слов. (с) Ария. "Улица роз".
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Это конечно потрясающая идея написать программу, которая будет за тебя играсть в компьютерные игры сама :)

Но многие игровые программы опрашивают игровой контроллер и контроллер клавиатуры сами, не используя ОС и ее драйверы (также несложно, например, для работы с мышью не использовать функции операционной системы, а только функции BIOS). Таким программам нет никакого дела до VK_UP!

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

В общих чертах, для управления контроллером надо делать что-то типа

Код: Выделить всё

asm
  in ПОРТ, КОМАНДА
  out ПРОРТ, КОМАНДА
end;
Т.е. надо что-то писать в порты контроллера (или читать из них).
Например, пусть для определения нажата ли кнопка ждойстика надо читать из порта П1, если там 1, то нажата, 0 - не нажата (Это только методический пример! На практике все может оказаться немного сложнее. Например, контроллер клавиатуры надо опрашивать после специального прерывания, а после опроса обязательно заприсать число 20h в порт 20h).

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

Короче говоря:
Если программа не ловит события посылаемые ей средствами операционной системы, то это значит, что данная программа не использует средства ОС для реализации данной функции, а использует прерывания BIOS или контроллер непосредственно.
В большинстве подобных случаев ответом на Ваш вопрос будет: "IMPOSSIBLE".
Ответить