|
|
Регистрация | << Правила форума >> | 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. Готовых программ испробовано громадное количество... Везде есть свои подводные камни, в итоге не подошло ничего. И еще куча нюансов. Если тема найдет хоть одного ответчика, с радостью пообщаюсь. |
#2
|
||||
|
||||
Цитата:
Так вот в игрушках часто используются левые способы работы с клавиатурой, основанные не на обработке WM_KEYDOWN, а на базе всяких DirectInput. Сообщениями тут не отделаться. Можно попробовать keybd_event или (лучше) SendInput. Но не факт, что они сработают. jmp $ ; Happy End! The Cake Is A Lie. |
#3
|
|||
|
|||
Цитата:
И самое то интересное - все кроме этих 4х кнопок отрабатывает. Получается они отдельно на 4 кнопки захват через directinput писали что-ли? Слабо верится... Последний раз редактировалось Alius, 03.09.2014 в 17:08. |