Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.029 c
1-1089617818
_none_
2004-07-12 11:36
2004.07.25
Application.OnIdle


1-1089610018
ancara
2004-07-12 09:26
2004.07.25
Аналог CopyMemory в CLX


14-1089096754
Alibaba
2004-07-06 10:52
2004.07.25
Артист


6-1085565720
kalishenko
2004-05-26 14:02
2004.07.25
Пример UDP-сервера на API


1-1089274655
aliced
2004-07-08 12:17
2004.07.25
Панель Delphi отсутствует при открытии проекта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский