Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2011, 08:42   #1
KamiMAN
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 13
По умолчанию Эмуляция нажатия клавиш

Всем доброго времени суток, мне нужно написать програмку, которая в игре просто нажимала бы поочередно 1, 2, 3...
Интерфейс программы приблизительно такой

Прога должна просто при нажатии button`a "Tab" нажать в игре Tab о_О При нажатии button`a "1" нажать 1 и т.д

На примере блокнота, мы открываем блокнот, жмем в проге 1, в блокноте пишется 1 Жмем в проге Tab, он делает отступ, только вот если все это чудо заработает в блокноте, заработает ли в игре? Я где то прочитал что игры используют другой способ считывания клавиш?

Заранее спасибо
KamiMAN вне форума Ответить с цитированием
Старый 12.03.2011, 09:15   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,118
По умолчанию

Было, темы внизу намекают.

П.С. С играми надо быть аккуратне, часто они используют DirectInput и подобное.
p51x вне форума Ответить с цитированием
Старый 12.03.2011, 09:26   #3
KamiMAN
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 13
По умолчанию

Эмм... Я даж похожего ничего внизу незаметил... Как я понял к примеру что то подобное не прокатит: в OnKeyPress прописать Send 1 Я наверное неправильно понимаю =)
KamiMAN вне форума Ответить с цитированием
Старый 12.03.2011, 09:43   #4
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

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

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

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

Код :
asm
in ПОРТ, КОМАНДА
out ПРОРТ, КОМАНДА
end;

Т.е. надо что-то писать в порты контроллера (или читать из них).
Например, пусть для определения нажата ли кнопка ждойстика надо читать из порта П1, если там 1, то нажата, 0 - не нажата (Это только методический пример! На практике все может оказаться немного сложнее. Например, контроллер клавиатуры надо опрашивать после специального прерывания, а после опроса обязательно заприсать число 20h в порт 20h).
http://forum.developing.ru/showthrea...лавиши-в-играх

если у вас все работает через ось, то вот читаите
Цитата:
процедура, позволяющаю отправлять нажатия в любой элемент управления (window control), способный принимать ввод с клавиатуры. Вы можете использовать эту технику чтобы включать клавиши NumLock, CapsLock и ScrollLock под Windows NT. Та же техника работает и под Windows 95 для CapsLock и ScrollLock, но не работает для клавиши NumLock. Обратите внимание, что приведены четыре поцедуры:

SimulateKeyDown() - эмулировать нажатие клавиши (без отпускания)
SimulateKeyUp() - эмулировать отпускание клавиши
SimulateKeystroke() - эмулировать удар по клавише (нажатие и отпускание) и
SendKeys(), позволяющие Вам гибко контролировать посылаемые сообщения клавиатуры.

SimulateKeyDown(), SimulateKeyUp() и SimulateKeystroke() получают коды виртуальных клавиш (virtural key) (вроде VK_F1). Процедура SimulateKeystroke() получает дополнительный параметр, полезный при эмуляции нажатия PrintScreen. Когда этот параметр равен нулю весь экран будет скопирован в буфер обмена (clipboard). Если дополнительный параметр равен 1 будет скопированно только активное окно.

Четыре метода "button click" демонстрируют использование:

ButtonClick1 - включает capslock
ButtonClick2 - перехватывает весь экран в буфер обмена (clipboard).
ButtonClick3 - перехватывает активное окно в буфер обмена (clipboard).
ButtonClick4 - устанавливает фокус в Edit и отправляет в него строку.
Пример:
Код:
procedure SimulateKeyDown(Key : byte);
begin
    keybd_event(Key, 0, 0, 0);
end;

procedure SimulateKeyUp(Key : byte);
begin
    keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;

procedure SimulateKeystroke(Key : byte; extra : DWORD);
begin
    keybd_event(Key,extra,0,0);
    keybd_event(Key,extra,KEYEVENTF_KEYUP,0);
end;

procedure SendKeys(s : string);
var
    i : integer;
    flag : bool;
    w : word;
begin
    {Get the state of the caps lock key}
    flag := not GetKeyState(VK_CAPITAL) and 1 = 0;
    {If the caps lock key is on then turn it off}
    if flag then
        SimulateKeystroke(VK_CAPITAL, 0);
    for i := 1 to Length(s) do
        begin
            w := VkKeyScan(s[i]);
            {If there is not an error in the key translation}
            if ((HiByte(w) <> $FF) and (LoByte(w) <> $FF)) then
                begin
                    {If the key requires the shift key down - hold it down}
                    if HiByte(w) and 1 = 1 then
                        SimulateKeyDown(VK_SHIFT);
                        {Send the VK_KEY}
                    SimulateKeystroke(LoByte(w), 0);
                    {If the key required the shift key down - release it}
                    if HiByte(w) and 1 = 1 then
                        SimulateKeyUp(VK_SHIFT);
                end;
        end;
{if the caps lock key was on at start, turn it back on}
if flag then
    SimulateKeystroke(VK_CAPITAL, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    {Toggle the cap lock}
    SimulateKeystroke(VK_CAPITAL, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    {Capture the entire screen to the clipboard}
    {by simulating pressing the PrintScreen key}
    SimulateKeystroke(VK_SNAPSHOT, 0);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    {Capture the active window to the clipboard}
    {by simulating pressing the PrintScreen key}
    SimulateKeystroke(VK_SNAPSHOT, 1);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
    {Set the focus to a window (edit control) and send it a string}
    Application.ProcessMessages;
    Edit1.SetFocus;
    SendKeys('Delphi Is RAD!');
end;
http://www.delphisources.ru/pages/fa...mulation2.html
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 12.03.2011, 12:49   #5
KamiMAN
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 13
По умолчанию

Так, суметь я сумел, но игра нечитает >_< ОС Tab "принимает", а игра нет, значит она принимает нажатия клавиш напрямую с клавиатуры. Как обмануть игру можно то? Как сэмулировать посылку нажатий как бы с клавиатуры? Ведь пишут же боты для игр, если не ошибаюсь на яве? Подскажите как написать бота для игры? Даже самого простого, чтобы мог нажимать Tab и 1?
KamiMAN вне форума Ответить с цитированием
Старый 13.03.2011, 06:24   #6
KamiMAN
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 13
По умолчанию

На правах апа
KamiMAN вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эмуляция нажатия клавиш в свернутом окне на уровне драйвера Razlo Win Api 3 26.08.2010 20:08
Работаем с клавиатурой (эмуляция нажатия клавиш) darkarrow Общие вопросы Delphi 4 02.07.2010 12:08
Эмуляция нажатия мультимедийных клавиш W0LF Общие вопросы Delphi 0 03.04.2010 22:01
Эмуляция нажатия нескольких клавиш -=Shad0www Общие вопросы Delphi 3 12.05.2008 08:13