|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
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. Готовых программ испробовано громадное количество... Везде есть свои подводные камни, в итоге не подошло ничего. И еще куча нюансов. Если тема найдет хоть одного ответчика, с радостью пообщаюсь. |