Здравствуйте, уважаемые форумчане! После недели безуспешных потуг в своей идее бегу к Вам на поклон. Сразу к делу. Что есть.
Кусок клиентской части (хукающая систему):
Код:
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. Готовых программ испробовано громадное количество... Везде есть свои подводные камни, в итоге не подошло ничего.
И еще куча нюансов. Если тема найдет хоть одного ответчика, с радостью пообщаюсь.