Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Перехват сообщений между программами


Автор: Redhopter 12.10.2004, 07:18
Пусть есть 2 программы, обменивающиеся сообщениями:передатчик и приемник. Передатчик шлет сообщение при помощи postmessage или sendmessage программе-приемнику. Сообщение пользовательское, т.е. сообщение=wm_User+(какое-то число). Программа-приемник принимает это сообщение и выполняет какое - либо действие.
Тепеь вопрос: как мне написать программу-перехватчик, которая будет перехватывать сообщение,посылаемое программой-передатчиком, затем спрашивать у пользователя:"Передать сообщение программе-приемнику" и затем,передавать или не передавать его программе-приемнику?
Может можно, как-нить попробовать переадресовать сообщения вместо программе-приемнику системно можно пересылать их программе-перехватчику?
qstn.gif
sample.gif
Если у кого есть код программы, то выложите ..Желательно и саму программу с исходниками...

Автор: x77 12.10.2004, 09:46
а зачем все эти сложности? ну шли сообщения сразу "программе - перехватчику", пусть она спрашивает у пользователя и, в свою очередь, отсылает его конечной "программе - приёмнику".

Автор: Redhopter 12.10.2004, 13:44
Нет...Это надо мне так как надо написать фильтр сообщений для одной программы...И для этого мне надо перехватывать посылаемые ей сообщения
Добавлено @ 13:46
Интересно, хоть кто-нить это знает???
sample.gif

Автор: x77 12.10.2004, 14:13
это делается через SetWindowsHookEx, где idHook = WH_CALLWNDPROC.

смотри в Win32 SDK.

Автор: Guest 13.10.2004, 08:21
http://www.delphiworld.narod.ru/base/create_hook.html

Автор: Redhopter 17.10.2004, 09:42
Товарищи!!!
Всятаки если не тяжело, то объясните как пользовать функцию SetWindowsHookEx..
синтаксис: function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK;
Понятно, что для моего случая idHook=WH_CALLWNDPROC, т.к. я хочу перехватывать сообщение пока оно дойдет до окна.А вот чему поставить значение адреса в памяти функции ловушки lpfn? как его найти?
Теперь еще вопрос:для отлеживания сообщений для одной программы мне надо надо поставить локальную ловушку или глобальную? Ведь я буду отслеживать сообщения для другой программы, а не для своей...И если ставить глобаьную, то опять как мне найти hmod?
И конец...как понимать фразу "id потока, который Ваша программа будет контролировать"..
Т.е я должен контролировать программу, которая посылает сообщения или принимает?...



:qstn

Автор: Redhopter 18.10.2004, 17:37
Блин народ..подскадите как правильно использовать SetWindowsEx
:sample

Автор: decoder 18.10.2004, 17:42
Про хуке в ДРКБ написссссссано:)
WH_CALLWNDPROC - не нужен, в принципе.
WH_GETMESSAGE - это сила!
Пишешь хук ГЕТМЕСЕДЖ, там ловишь своё сообщение и "резалт := 1".
Хэлп спасёт мир!
Добавлено @ 17:43
Народ, и мне расскажите чё за функция SetWindowsEx!!!!!!!

Автор: x77 18.10.2004, 19:09
SetWindowExtEх, могет быть? а то, типа, нет такой функции :(

Автор: Redhopter 18.10.2004, 19:34
Да кстати, а где резальт прописывать?и че это вообще за резальт?Он к getmessage или к setwindowshookex относиться

Автор: decoder 18.10.2004, 20:39
Батенька, читайте хэлп!
Ладно, напишу чё-нить...
Код длл-ки:
Код

library dll
uses
 Windows, Messages;
var
 Hook: hHook;
function HookProc(Code: Integer; wParam: Word; lParam: Integer): Integer; stdcall;
 begin
   if (TMsg(Pointer(lParam)^).message) = WM_YOURMESSAGE{твоё сообщение}) and (TMsg(Pointer(lParam)^).hwnd = Window_Receiver{хэндл твоего окна-приемника}) then
     begin
       {с диалогами сам думай}
       if Applied then {Applied - переменная. Тру - сообщение посылать, Фолс - не посылать}
         Result := CallNextHookEx(Hook, Code, wParam, lParam)
       else
         Result := 1;
     end;
 end;
function SetHook(State: Boolean): Boolean; export;
 begin
   if State then
     begin
       if Hook = 0 then Hook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, hInstance, 0);
       Result := (Hook <> 0);
     end
   else
     begin
       if Hook <> 0 then UnhookWindowsHookEx(Hook);
       Result := True;
     end;
 end;
exports SetHook;
begin
end.

Эх, делать мне нечего...

Автор: Redhopter 18.10.2004, 21:22
Блин..реябт..вы мне помогли..а то я б с этим WinApi долго б еще разбирался...Хотя начал потихоньку вникать...Но вы мне окончательно помогли...
Большое человеческое спасибо....

Автор: decoder 18.10.2004, 21:27
Cпасибо не булькает... Ладно, смирюсь с безисходностью...

Автор: x77 18.10.2004, 21:30
decoder, а вдруг он тоже харьковский? :) булькало - оно понятие растяжимое, учитывая что земля - круглая, а жизнь - долгая :)

сорри за оффтоп.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)