Главная страница
    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.051 c
6-1085649239
Delpher_Gray
2004-05-27 13:13
2004.07.25
Проблема с HTTP->Get запросом


1-1089373456
serg128
2004-07-09 15:44
2004.07.25
Как в RichEdit добавить текст в то место, где мигает курсор?


14-1089199366
Nein
2004-07-07 15:22
2004.07.25
как догнать двух зайцев?


3-1088683383
ligor
2004-07-01 16:03
2004.07.25
SQL-запрос


14-1089123073
VEG
2004-07-06 18:11
2004.07.25
Дайте, пожалуйста, совет насчет доменов и хостинга





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский