![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
HookMenu
DjOne © (2004-06-07 00:42:00)Ставлю глобальный хук на отлов меню.
Почемуто он толавливает только одно сообщение WM_MENUSELECT
И то не вовсех меню! Остальные сообщения связаные с меню вообще не видит.
DjOne (2004-06-09 23:08:00) [1]Ясно. А как это сообщение послать, Sendmessage()???
Игорь Шевченко (2004-06-09 00:46:00) [2]DjOne (09.06.04 00:22)
Лучший способ - послать из DLL окну программы сообщение, с параметром, равным тому самому Handle, то есть, обмен должна инициировать сама DLL
DjOne (2004-06-09 00:22:00) [3]Нет. Я не правильно выразился.
Как в программе получить функцию из dll, с результатом PCWPStruct(LParam)^.Handle
Игорь Шевченко (2004-06-08 23:52:00) [4]DjOne (08.06.04 21:42)
> Может ещё подскажешь как передать проге из длл что то типа
> PCWPStruct(LParam)^.Handle
Многими способами, от MMF до посылки сообщения окну программы (или потоку)
DjOne (2004-06-08 21:42:00) [5]Спасибо всё заработало!
Может ещё подскажешь как передать проге из длл что то типа PCWPStruct(LParam)^.Handle
NAlexey (2004-06-08 08:33:00) [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;
NAlexey (2004-06-08 08:29:00) [7]>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;
Djone (2004-06-07 23:59:00) [8]Я вроди бы пробовал не работала.
А Как правильно?
NAlexey (2004-06-07 15:27:00) [9]>Djone (07.06.04 13:14) [2]
А почему не на WH_CALLWNDPROC?
Djone (2004-06-07 13:14:00) [10]Это в длл
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;
GanibalLector (2004-06-07 02:01:00) [11]а код ???
как принято в этом форуме говорить телепаты в отпуске :)