Форум: "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.036 c