Всем привет, столкнулся с проблемой: мне нужно написать программу для нажатия ХотКей в игре. Я нашел класс окна и handle окна, и Pid, но при отправке нажатия клавиши окно никак не реагирует. Пробовал много чего, а именно (да, знаю что после возврата из процедур значение регистров общего назначения не сохраняется, но все же...):
В принципе достаточно эмулирования сообщением Keydown.
Какие конкретно клавиши ты пытаешься передавать сообщениями?
Проверь работоспособность кода на окне блокнота, а не игрушки.
________________ Dinmaite пишет с меня, когда он на работе.
Вообще-то во многих случаях отсылка сообщений KeyDown и KeyUp приводит к тому, что приложение считает их двумя нажатиями. Пример в архиве. Код от ToRcH2565 с исправленным называнием переменной.
Код:
procedure Key(Wnd: HWND; VKey: Integer);
Begin
PostMessage(Wnd,WM_KEYDOWN,Vkey,0);
Sleep(100);
PostMessage(Wnd,WM_KEYUP, Vkey,0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
key(memo1.Handle, 50); //50 - сканкод для клавиши "2".
end;
[Ссылки могут видеть только зарегистрированные пользователи. ]
________________ Dinmaite пишет с меня, когда он на работе.
Последний раз редактировалось Dinmaite[Work]; 08.10.2013 в 10:10.
Причина: Забыл вложение.
Вообще-то во многих случаях отсылка сообщений KeyDown и KeyUp приводит к тому, что приложение считает их двумя нажатиями. Пример в архиве. Код от ToRcH2565 с исправленным называнием переменной.
Код:
procedure Key(Wnd: HWND; VKey: Integer);
Begin
PostMessage(Wnd,WM_KEYDOWN,Vkey,0);
Sleep(100);
PostMessage(Wnd,WM_KEYUP, Vkey,0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
key(memo1.Handle, 50); //50 - сканкод для клавиши "2".
end;
[Ссылки могут видеть только зарегистрированные пользователи. ]
За правку кода спасибо, но есть одно но.
Цитата:
Сообщение от Dinmaite[Work]
что приложение считает их двумя нажатиями
.
Не в тот контрол шлем, нужно родителю(непомню точно), вроде как самому процессу, и тогда повтор режется им. а допустим некоторые обработчики вас неверно поймут при отсылке только одной клавиши.
Ибо сколько себя помню в программах(которые не автоматом сообщения парсят а ручками) делал такой вариант клавиш:
Код:
Var
Keys:array of boolean;
{Много кода...}
Case msg of:
{Опять много кода};
WM_KEYUP : keys[wpram]=false;
WM_KEYDOWN : keys[wpram]=true;
end.
И где мне нужны кнопки там с ними и работал(с массивом).
Ps. код не рабочий, приведен для понимания где возникнет ошибка.
Последний раз редактировалось ToRcH2565; 08.10.2013 в 12:50.
Для примера в JD при попытке отослать текст в чат сообщениями keydown + keyup происходит "двойное нажатие".
Да и собственно с чего бы отсылать сообщения родителю? У родителя вообще нет хэндла (родитель TCustomMemo), т.к. он отдельно не загружен. И будь добр покажи как процессу послать windowmessage.
Цитата:
Сообщение от ToRcH2565
И где мне нужны кнопки там с ними и работал(с массивом).
Не понял что ты хотел этим сказать.
________________ Dinmaite пишет с меня, когда он на работе.
Да и собственно с чего бы отсылать сообщения родителю? У родителя вообще нет хэндла (родитель TCustomMemo), т.к. он отдельно не загружен.
Родитель Memo - форма, родитель формы - процесс.
Все зависит от того где первичный обработчик клавиш.
Есть ведь процессы без окон? и они тоже могут получать сообщения от системы.
Цитата:
Сообщение от Dinmaite[Work]
И будь добр покажи как процессу послать windowmessage.
Тогда ответ прост. Это патчер памяти. Патчит какой-то longjump в nop'ы (вероятно). Что конкретно можно узнать только проверив. Найти этот адрес под другой клиент можно только зная что он патчит в этом.
________________
Ни одно доброе дело не остается безнаказанным.
Не родитель, а владелец (хозяин) называй вещи своими именами.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Прошу, своими именами(паскали).
как пример, автокомплит XE2
Могу даже больше сказать, можно не являтся влядельцем обьекта но быть его родителем(и наоборот быть родителем но не быть владельцем), по крайней мере такое возможно на win xp.
Цитата:
Сообщение от Dinmaite[Work]
К чему логические рассуждения? Кодом покажи.
Лень искать свои старые исходники, любой пример Яна Хорна по OpenGL взять и послать ему кнопки, окно там есть, но суть не изменится если выпилить окно(проверял когда баловался OpenGL) взять например тут sulaco.co.za.
Последний раз редактировалось ToRcH2565; 11.10.2013 в 02:09.