Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.09.2014, 09:41
Alius Alius вне форума
Прохожий
 
Регистрация: 02.09.2014
Сообщения: 2
Версия Delphi: delphi 2010
Репутация: 10
По умолчанию Real-time multiboxing, или снова о хуках двести-тридцать-семь

Здравствуйте, уважаемые форумчане! После недели безуспешных потуг в своей идее бегу к Вам на поклон. Сразу к делу. Что есть.
Кусок клиентской части (хукающая систему):

Код:
procedure sendsocket(x:TSendRec);
begin
  Form1.Client.Socket.SendBuf(x,sizeof(x));
end;

function LowLevelKeyboardProc(code: Integer; wParam: WPARAM; lParam: LPARAM;) : LRESULT; stdcall;
var
  kb: PKBDLLHOOKSTRUCT;
  window:hwnd;
begin
  if (code < 0) then begin
    Result := CallNextHookEx(0, code, wParam, lParam);
    Exit;
  end;
  kb := PKBDLLHOOKSTRUCT(lParam);
  if wparam=256 then
  begin
    sr.a:=kb.vkCode;
    sr.b:=1;
    sendsocket(sr);
  end
  else
  begin
    sr.a:=kb.vkCode;
    sr.b:=2;
    sendsocket(sr);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  hHook := SetWindowsHookEx( WH_KEYBOARD_LL, @LowLevelKeyboardProc, GetModuleHandle(nil), 0 );
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 UnhookWindowsHookEx( hHook );
end;

Кусок, отвечающий за прием данных с другого компьютера и отправку окну:

Код:
procedure TForm1.srvClientRead(Sender: TObject; Socket: TCustomWinSocket);
var sr:TSendRec;
begin
  Socket.ReceiveBuf(sr,SizeOf(sr));
  if sr.b=1 then
    postmessage(window,wm_keydown,sr.a,0)
  else
    postmessage(window,wm_keyup,sr.a,0);
end;

Хэндл окна получаю так:
Код:
window:=FindWindow(nil,'Непослушная игрушка');

Итог: если запустить оба приложения на одном компьютере и клацать по клаве в блокнотике допустим, все идеально. Стоит разнести приложения по разным компьютерам в локалке, работает все кроме клавиш передвижения (WSAD). Подскажите, где я балбес...
P.S. Отлавливал сообщения окну через Spy++. Даже когда приложения разнесены, окно получает сообщение о кнопках так же, как их бы нажимали на физической клаве. Ну почти также. Один лишний wm_char проскакивает.
P.P.S. Через SendMessage вообще ноль эмоций, на все нажатия.
P.P.P.S. Готовых программ испробовано громадное количество... Везде есть свои подводные камни, в итоге не подошло ничего.
И еще куча нюансов. Если тема найдет хоть одного ответчика, с радостью пообщаюсь.
Ответить с цитированием
  #2  
Старый 03.09.2014, 16:46
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
все кроме клавиш передвижения (WSAD)
Как я понимаю, не работает именно в игрушке (в блокноте-то W,S,A,D работают?)
Так вот в игрушках часто используются левые способы работы с клавиатурой, основанные не на обработке WM_KEYDOWN, а на базе всяких DirectInput. Сообщениями тут не отделаться.
Можно попробовать keybd_event или (лучше) SendInput. Но не факт, что они сработают.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 03.09.2014, 17:06
Alius Alius вне форума
Прохожий
 
Регистрация: 02.09.2014
Сообщения: 2
Версия Delphi: delphi 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Как я понимаю, не работает именно в игрушке (в блокноте-то W,S,A,D работают?)
Так вот в игрушках часто используются левые способы работы с клавиатурой, основанные не на обработке WM_KEYDOWN, а на базе всяких DirectInput. Сообщениями тут не отделаться.
Можно попробовать keybd_event или (лучше) SendInput. Но не факт, что они сработают.
И в блокноте работают, и даже если открыть в игре чатик, в чат wsad прописываются. keybd_event игра игнорирует напрочь. А вот 2 интересные программки с функцией бродкаста отрабатывают идеально. Но они конфликтуют с единственным найденным мной бродкастером мыши. Думаю бродкаст мыши будет написать куда сложнее...

И самое то интересное - все кроме этих 4х кнопок отрабатывает. Получается они отдельно на 4 кнопки захват через directinput писали что-ли? Слабо верится...

Последний раз редактировалось Alius, 03.09.2014 в 17:08.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter