Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Эмуляция нажатия клавиши в неактивном окне

-

Общение разработчиков

- Программирование для Perfect World, общение и обсуждене разработок

Ответ
 
Опции темы
Старый 07.10.2013, 22:02   #1
 Разведчик
Аватар для xOmGLoLx
 
xOmGLoLx никому не известный тип
Регистрация: 07.10.2013
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
Exclamation Эмуляция нажатия клавиши в неактивном окне

Всем привет, столкнулся с проблемой: мне нужно написать программу для нажатия ХотКей в игре. Я нашел класс окна и handle окна, и Pid, но при отправке нажатия клавиши окно никак не реагирует. Пробовал много чего, а именно (да, знаю что после возврата из процедур значение регистров общего назначения не сохраняется, но все же...):


1)
procedure Key(Wnd: HWND; VKey: Integer);
asm
push 0
push edx
push 0101H ------------KEYUP
push eax
push 0
push edx
push 0100H ------------KEYDOWN
push eax
call PostMessage
call PostMessage
end;

Key(handle, key); НЕ ПАШЕТ

ИЛИ


procedure Key(Wnd: HWND; VKey: Integer);
asm
push 0
push edx
push 0101H -----------------KEYUP
push eax
call PostMessage
push 0
push edx
push 0100H ----------------KEYDOWN
push eax
call PostMessage
end;



2)Пробовал sendmessage, postmessage, для них пробовал vm_char,wm_keydown,wm_keyup. И еще много чего......


Думаю, друзья, вы поможете мне решить эту проблему!! Буду благодарен!
Пишу на Delphi 7
  Ответить с цитированием
Старый 07.10.2013, 22:52   #2
 Разведчик
Аватар для Dinmaite[Work]
 
Dinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небе
Регистрация: 05.03.2011
Сообщений: 40
Популярность: 841
Сказал(а) спасибо: 1
Поблагодарили 9 раз(а) в 8 сообщениях
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

В принципе достаточно эмулирования сообщением Keydown.
Какие конкретно клавиши ты пытаешься передавать сообщениями?
Проверь работоспособность кода на окне блокнота, а не игрушки.
________________
Dinmaite пишет с меня, когда он на работе.
  Ответить с цитированием
Старый 08.10.2013, 00:55   #3
-= Мастер Света =-
 Рыцарь-капитан
Аватар для Ginrey
 
Ginrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака Норриса
Регистрация: 14.06.2012
Сообщений: 511
Популярность: 7566
Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

а если за секунду перенести окно на передний план выполнить действие и вернуть обратно?
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо"

Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
  Ответить с цитированием
Старый 08.10.2013, 09:36   #4
 Пехотинец
Аватар для ToRcH2565
 
ToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известен
Регистрация: 02.08.2009
Сообщений: 57
Популярность: 417
Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

1) Клавиши идут в обратной последовательности(DOWN->UP)
2) К чему ассемблер?
3) Пауза между сообщениями.

procedure Key(Wnd: HWND; VKey: Integer);
Begin
PostMessage(Wnd,WM_KEYDOWN,key,0);
Sleep(100);
PostMessage(Wnd,WM_KEYUP, key,0);
end;
  Ответить с цитированием
Старый 08.10.2013, 10:09   #5
 Разведчик
Аватар для Dinmaite[Work]
 
Dinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небе
Регистрация: 05.03.2011
Сообщений: 40
Популярность: 841
Сказал(а) спасибо: 1
Поблагодарили 9 раз(а) в 8 сообщениях
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

Вообще-то во многих случаях отсылка сообщений 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;
[Ссылки могут видеть только зарегистрированные пользователи. ]
Вложения
Тип файла: rar Project1.rar (158.1 Кб, 27 просмотров)
________________
Dinmaite пишет с меня, когда он на работе.

Последний раз редактировалось Dinmaite[Work]; 08.10.2013 в 10:10. Причина: Забыл вложение.
  Ответить с цитированием
Старый 08.10.2013, 12:47   #6
 Пехотинец
Аватар для ToRcH2565
 
ToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известен
Регистрация: 02.08.2009
Сообщений: 57
Популярность: 417
Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

Цитата:
Сообщение от Dinmaite[Work]Посмотреть сообщение
Вообще-то во многих случаях отсылка сообщений 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.
  Ответить с цитированием
Старый 08.10.2013, 13:38   #7
 Разведчик
Аватар для Dinmaite[Work]
 
Dinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небе
Регистрация: 05.03.2011
Сообщений: 40
Популярность: 841
Сказал(а) спасибо: 1
Поблагодарили 9 раз(а) в 8 сообщениях
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

Для примера в JD при попытке отослать текст в чат сообщениями keydown + keyup происходит "двойное нажатие".

Да и собственно с чего бы отсылать сообщения родителю? У родителя вообще нет хэндла (родитель TCustomMemo), т.к. он отдельно не загружен. И будь добр покажи как процессу послать windowmessage.

Цитата:
Сообщение от ToRcH2565Посмотреть сообщение
И где мне нужны кнопки там с ними и работал(с массивом).

Не понял что ты хотел этим сказать.
________________
Dinmaite пишет с меня, когда он на работе.
  Ответить с цитированием
Старый 08.10.2013, 22:22   #8
 Разведчик
Аватар для Envy12
 
Envy12 определенно авторитетная личностьEnvy12 определенно авторитетная личностьEnvy12 определенно авторитетная личностьEnvy12 определенно авторитетная личностьEnvy12 определенно авторитетная личностьEnvy12 определенно авторитетная личностьEnvy12 определенно авторитетная личностьEnvy12 определенно авторитетная личностьEnvy12 определенно авторитетная личность
Регистрация: 11.06.2010
Сообщений: 3
Популярность: 1189
Сказал(а) спасибо: 0
Поблагодарили 5 раз(а) в 1 сообщении
Отправить сообщение для Envy12 с помощью Skype™
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

Возможно бред скажу, но все же. В пв есть такая вещь как фриз, так вот во время фриза могут не принематся нажатия в окно.
  Ответить с цитированием
Старый 09.10.2013, 11:47   #9
 Пехотинец
Аватар для ToRcH2565
 
ToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известен
Регистрация: 02.08.2009
Сообщений: 57
Популярность: 417
Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

Цитата:
Сообщение от Dinmaite[Work]Посмотреть сообщение
Да и собственно с чего бы отсылать сообщения родителю? У родителя вообще нет хэндла (родитель TCustomMemo), т.к. он отдельно не загружен.

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

Цитата:
Сообщение от Dinmaite[Work]Посмотреть сообщение
И будь добр покажи как процессу послать windowmessage.

точно также как и форме(контролу и прочему).
  Ответить с цитированием
Старый 10.10.2013, 16:55   #10
 Разведчик
Аватар для Dinmaite[Work]
 
Dinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небеDinmaite[Work] лучик света в грозовом небе
Регистрация: 05.03.2011
Сообщений: 40
Популярность: 841
Сказал(а) спасибо: 1
Поблагодарили 9 раз(а) в 8 сообщениях
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

Цитата:
Сообщение от ToRcH2565Посмотреть сообщение
Родитель Memo - форма, родитель формы - процесс.

Не родитель, а владелец (хозяин) называй вещи своими именами.


Цитата:
Сообщение от ToRcH2565Посмотреть сообщение
Есть ведь процессы без окон? и они тоже могут получать сообщения от системы.

Цитата:
Сообщение от ToRcH2565Посмотреть сообщение
точно также как и форме(контролу и прочему).

К чему логические рассуждения? Кодом покажи.
________________
Dinmaite пишет с меня, когда он на работе.
  Ответить с цитированием
Старый 10.10.2013, 18:13   #11
 Разведчик
Аватар для xOmGLoLx
 
xOmGLoLx никому не известный тип
Регистрация: 07.10.2013
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

У меня есть код


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure MemoryPatch(hProcess, Addres: DWord; bytecode: string);
var
i: DWord;
bytecount: dword;
buf: byte;
begin
i := (length(bytecode) div 2) - 1;
for i := 0 to i do
begin
buf := strtoint('$' + bytecode[i * 2 + 1] + bytecode[i * 2 + 2]);
writeprocessmemory(hProcess, ptr(Addres + i), @buf, 1, bytecount);
end;
end;




procedure TForm1.Button1Click(Sender: TObject);
var
H: hwnd;
HandleProc, i, Pid: integer;
rw: dword;
adress: integer;
begin
i := 1;
adress := $00420206;
H := FindWindow(nil, 'Perfect World');
If H = 0 then
begin
MessageDlg('!', mtwarning, [mbOK], 0);
exit;
end
else
begin
GetWindowThreadProcessId(H, @Pid);
HandleProc := OpenProcess(PROCESS_ALL_ACCESS, False, Pid);
MemoryPatch(HandleProc, adress, '909090909090');
writeprocessmemory(HandleProc, ptr($00420206), @i, sizeof(i), rw);
end;

end.



Интересует выделенное красным шрифтом.
Забыл добавить, код unfreeze

Последний раз редактировалось xOmGLoLx; 10.10.2013 в 18:43. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 10.10.2013, 19:36   #12
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,004
Популярность: 25098
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 110
Поблагодарили 830 раз(а) в 395 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

Цитата:
Сообщение от xOmGLoLxПосмотреть сообщение
Интересует выделенное красным шрифтом.

Отличный вопрос как таковой. Интерисует что это такое или как найти этот адрес под другой клиент?
  Ответить с цитированием
Старый 10.10.2013, 19:50   #13
 Разведчик
Аватар для xOmGLoLx
 
xOmGLoLx никому не известный тип
Регистрация: 07.10.2013
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

Цитата:
Сообщение от DinmaiteПосмотреть сообщение
Отличный вопрос как таковой. Интерисует что это такое или как найти этот адрес под другой клиент?

И то, и другое
  Ответить с цитированием
Старый 10.10.2013, 21:01   #14
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,004
Популярность: 25098
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 110
Поблагодарили 830 раз(а) в 395 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

Цитата:
Сообщение от xOmGLoLxПосмотреть сообщение
И то, и другое

Тогда ответ прост. Это патчер памяти. Патчит какой-то longjump в nop'ы (вероятно). Что конкретно можно узнать только проверив. Найти этот адрес под другой клиент можно только зная что он патчит в этом.
  Ответить с цитированием
Старый 11.10.2013, 02:02   #15
 Пехотинец
Аватар для ToRcH2565
 
ToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известен
Регистрация: 02.08.2009
Сообщений: 57
Популярность: 417
Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Эмуляция нажатия клавиши в неактивном окне

Цитата:
Сообщение от Dinmaite[Work]Посмотреть сообщение
Не родитель, а владелец (хозяин) называй вещи своими именами.

[Ссылки могут видеть только зарегистрированные пользователи. ]
Прошу, своими именами(паскали).

как пример, автокомплит XE2
Могу даже больше сказать, можно не являтся влядельцем обьекта но быть его родителем(и наоборот быть родителем но не быть владельцем), по крайней мере такое возможно на win xp.

Цитата:
Сообщение от Dinmaite[Work]Посмотреть сообщение
К чему логические рассуждения? Кодом покажи.

Лень искать свои старые исходники, любой пример Яна Хорна по OpenGL взять и послать ему кнопки, окно там есть, но суть не изменится если выпилить окно(проверял когда баловался OpenGL) взять например тут sulaco.co.za.
Изображения
Тип файла: jpg Безымянный.JPG (56.3 Кб, 295 просмотров)

Последний раз редактировалось ToRcH2565; 11.10.2013 в 02:09.
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Uopilot макрос в неактивном окне NarutoD Общение и обсуждение Perfect World 3 23.09.2013 18:43
[Помогите!] Автотайпер в неактивном окне Feass Общение и обсуждение Perfect World 2 16.03.2012 01:14
Макрос для работы в неактивном окне jinn Rising Force Online 15 18.04.2010 14:11
Программа для кача бафов в неактивном окне Lfot Rising Force Online 15 22.12.2009 23:07
Лутарь в неактивном окне для ФА ГЕРОЙ Вопросы и ответы: RF Online 9 10.07.2009 21:02

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 08:52.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net