Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.25;
Скачать: CL | DM;

Вниз

HookMenu   Найти похожие ветки 

 
DjOne   (2004-06-07 00:42) [0]

Ставлю глобальный хук на отлов меню.
Почемуто он толавливает только одно сообщение WM_MENUSELECT
И то не вовсех меню! Остальные сообщения связаные с меню вообще не видит.


 
GanibalLector ©   (2004-06-07 02:01) [1]

а код ???
как принято в этом форуме говорить телепаты в отпуске :)


 
Djone   (2004-06-07 13:14) [2]

Это в длл

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
 if code = HC_ACTION then
 begin

   Wnd:=TMsg(Pointer(lParam)^).hwnd;

 if TMsg(Pointer(lParam)^).message = WM_MENUSELECT then
   {Вывожу сообщение.}
   MessageBox(0, "HOOK1 working !", "Message from Exampel1/Process1", 0);
 end;
 { Пытаемся передать сообщение дальше по цепочке hook-ов. }
 Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
end;

{ Процедура установки HOOK-а}
procedure hook(switch : Boolean) export; stdcall;
begin
 if switch=true then
 begin
   { Устанавливаю HOOK, если он не установлен (switch=true). }
   SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
end;


 
NAlexey ©   (2004-06-07 15:27) [3]

>Djone   (07.06.04 13:14) [2]
А почему не на WH_CALLWNDPROC?


 
Djone   (2004-06-07 23:59) [4]

Я вроди бы пробовал не работала.
А Как правильно?


 
NAlexey ©   (2004-06-08 08:29) [5]

>Djone   (07.06.04 23:59) [4]
Ну не знаю, хотябы так:
В DLL -

library Project1;

uses
 Windows,
 Messages,
 Forms;

var
 HookHandle: HHOOK = 0;

function CallWndProcHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;

 function IsZOrderChange: boolean;
 begin
   with PWindowPos(PCWPStruct(LParam).lParam)^ do
     Result := (Flags and SWP_NOOWNERZORDER = 0) or
       (Flags and SWP_NOREPOSITION = 0) or (Flags and SWP_NOZORDER = 0) or
       (hwndInsertAfter = TopMost)
 end;
var
 Name: array[0..255] of Char;
 ClassName: array[0..255] of Char;
 Handle: HWND;
 PS: TPaintStruct;
 Parent: HWND;
begin
 if Code = HC_ACTION then
 begin
   with PCWPStruct(LParam)^ do
     if message = WM_MENUSELECT then
       MessageBox(0, "HOOK1 working !", "Message from Exampel1/Process1", 0);
 end;
 Result := CallNextHookEx(HookHandle, Code, WParam, LParam);
end;

procedure RegHook;
begin
 HookHandle := SetWindowsHookEx(WH_CALLWNDPROC,
   CallWndProcHook, HInstance, 0);
end;

procedure UnRegHook;
begin
 if HookHandle <> 0 then
 begin
   UnhookWindowsHookEx(HookHandle);
   HookHandle := 0;
 end;
end;

procedure StartWatching(StartWatching: boolean) export; stdcall;
begin
 if StartWatching then
   RegHook;
 else
   UnRegHook;
end;

exports StartWatching;

begin

end.


В приложении -

var
 HDll : HWND;

procedure TForm1.btnStartWatchingClick(Sender: TObject);
var
 DllProc: TDllProc;
begin
 @DllProc := nil;
 HDll:= LoadLibrary(PChar("Project1.dll"));
 if HDll > HINSTANCE_ERROR then
 begin
   @DllProc := GetProcAddress(HDll, "StartWatching");
   DllProc(Self.Handle, True);
 end else
   ShowMessage("!");
end;

procedure TForm1.btnStopWatchingClick(Sender: TObject);
var
 DllProc: TDllProc;
begin
 @DllProc := nil;
 if HDll > HINSTANCE_ERROR then
 begin
   @DllProc := GetProcAddress(Hdll, "Project1.dll");
   DllProc(0, False);
 end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if HDll <> HINSTANCE_ERROR then
   FreeLibrary(Hdll);
end;


 
NAlexey ©   (2004-06-08 08:33) [6]

Хм... Теперь без всего лишнего:

В DLL -

library Project1;

uses
 Windows,
 Messages,
 Forms;

var
 HookHandle: HHOOK = 0;

function CallWndProcHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
 if Code = HC_ACTION then
 begin
   with PCWPStruct(LParam)^ do
     if Message = WM_MENUSELECT then
       MessageBox(0, "HOOK1 working !", "Message from Exampel1/Process1", 0);
 end;
 Result := CallNextHookEx(HookHandle, Code, WParam, LParam);
end;

procedure RegHook;
begin
 HookHandle := SetWindowsHookEx(WH_CALLWNDPROC,
   CallWndProcHook, HInstance, 0);
end;

procedure UnRegHook;
begin
 if HookHandle <> 0 then
 begin
   UnhookWindowsHookEx(HookHandle);
   HookHandle := 0;
 end;
end;

procedure StartWatching(StartWatching: boolean) export; stdcall;
begin
 if StartWatching then
   RegHook;
 else
   UnRegHook;
end;

exports StartWatching;

begin

end.

В приложении -

var
HDll : HWND;

procedure TForm1.btnStartWatchingClick(Sender: TObject);
var
 DllProc: TDllProc;
begin
 @DllProc := nil;
 HDll:= LoadLibrary(PChar("Project1.dll"));
 if HDll > HINSTANCE_ERROR then
 begin
   @DllProc := GetProcAddress(HDll, "StartWatching");
   DllProc(True);
 end else
   ShowMessage("!");
end;

procedure TForm1.btnStopWatchingClick(Sender: TObject);
var
 DllProc: TDllProc;
begin
 @DllProc := nil;
 if HDll > HINSTANCE_ERROR then
 begin
   @DllProc := GetProcAddress(Hdll, "Project1.dll");
   DllProc(False);
 end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if HDll <> HINSTANCE_ERROR then
   FreeLibrary(Hdll);
end;


 
DjOne   (2004-06-08 21:42) [7]

Спасибо всё заработало!
Может ещё подскажешь как передать проге из длл что то типа PCWPStruct(LParam)^.Handle


 
Игорь Шевченко ©   (2004-06-08 23:52) [8]

DjOne   (08.06.04 21:42)


> Может ещё подскажешь как передать проге из длл что то типа
> PCWPStruct(LParam)^.Handle


Многими способами, от MMF до посылки сообщения окну программы (или потоку)


 
DjOne   (2004-06-09 00:22) [9]

Нет. Я не правильно выразился.
Как в программе получить функцию из dll, с результатом  PCWPStruct(LParam)^.Handle


 
Игорь Шевченко ©   (2004-06-09 00:46) [10]

DjOne   (09.06.04 00:22)

Лучший способ - послать из DLL окну программы сообщение, с параметром, равным тому самому Handle, то есть, обмен должна инициировать сама DLL


 
DjOne   (2004-06-09 23:08) [11]

Ясно. А как это сообщение послать, Sendmessage()???



Страницы: 1 вся ветка

Текущий архив: 2004.07.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.049 c
1-1089368180
Alek
2004-07-09 14:16
2004.07.25
Парсинг стринга


1-1089266877
EvgeniyR
2004-07-08 10:07
2004.07.25
Форматированный текс


11-1077827486
ALeX.B.
2004-02-26 23:31
2004.07.25
Как получить доступ к каждому из 4-х полей в IPEdit?


14-1089125494
Тимохов
2004-07-06 18:51
2004.07.25
Стартовая функция exe файла, созданного дельфи.


1-1089577711
DeOptric2
2004-07-12 00:28
2004.07.25
TreeView save