Форум: "WinAPI";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
ВнизWH_SHELL? Найти похожие ветки
← →
Bes (2003-08-22 16:06) [0]вообщем странности:)
нужно отловить создание окна (но так чтоб окно уже существовало)...
...
Hook:=SetWindowsHookEx(WH_SHELL,@HookProc,Hinstance,0);
...
ставлю хук на HCSHELL_WINDOWACTIVED....так он ловит только события связанные с моим окном (форма, которая загружет DLL),
почему он остальные окна не видит?.
← →
Игорь Шевченко (2003-08-22 16:20) [1]Потому что читать статью про хуки. На этом сайте в разделе "Статьи"
← →
Bes (2003-08-22 16:21) [2]Да еще попутный вопрос:
я при загрузке DLL"шной процедуре передаю хендл своей формы,
она (длл) его сохраняет, и когда ловушка отлавливает нужное сообщение она мне его посылает...это в теории....
а на практите странности...
в форме обрабатываю свое сообщение (WM_USER)
но оно не приходит (если посылать внутри хукпроцедуры), вот пример:
function ShellProc (code:integer;wparam:word;lparam:longint):longint;stdcall;
begin
if code=HSHELL_WINDOWCREATED then
begin
showmessage("Created");
sendmessage(PWindow,WM_WINOPEN,code,wparam); //Pwindow - хэндл моей формы...
end else
Result:=CallNextHookEx(WND_HOOk,code,wparam,lparam);
end;
так вот... мессага "Created" вылезает, а сообщение не приходит...
странно...
← →
jonni (2003-08-22 16:22) [3]Нужно ставить глобальный HOOK тобишь в DLL-ку........
//-------------------------
library SHELL;
const
MSG_SHELL=WM_USER+1;
procedure SetShellHook; export;
//
function SHELL_HookProc(nCode: Integer; WPARAM: wParam; LPARAM: lParam): LResult; stdcall;
begin
if nCode >= 0 then begin
SendMessage(HWND_TVOEGO_OKNA_KOTORO_LOVIT SOOBCHENIE_MSG_SHELL, MSG_SHELL,nCode,WPARAM);
end;
result := CallNextHookEx(rHookRec^.ShellHookID, nCode, wParam, lParam);
end;
//
procedure SetShellHook; export;
begin
SetWindowsHookEx(WH_SHELL, @SHELL_HookProc, hInstance, 0);
end;
//-------------------------
unit Unit1;
procedure SHELLSetShellHook; external "SHELL.dll" name "SetShellHook";
procedure WMSHELL(var Message: TMessage); message MSG_SHELL;
//
procedure TForm1.WMSHELL(var Message: TMessage);
begin
WindHWND:=Message.LParam;
case Message.WParam of
HSHELL_WINDOWCREATED:Memo1.Lines.Add("Activated"+IntToStr(WindHWND));
HSHELL_WINDOWDESTROYED:Memo1.Lines.Add("Destroyed"+IntToStr(WindHWND)) ;
HSHELL_WINDOWREPLACED,HSHELL_REDRAW:Memo1.Lines.Add("Other"+IntToStr(W indHWND));
end;
end;
//--------------------------------------
и создание окна вроде HSHELL_WINDOWCREATED.....
можно конечно и так сделать если не хочется писать DLL-ку...
//------------------------------------------------
Procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall;external "shell32.dll" index 181;
function SetShellWindow(hWnd: HWND): dword; stdcall; external "User32.dll" name "SetShellWindow";
WM_SHELLHOOKMESSAGE := RegisterWindowMessage("SHELLHOOK");
if WM_SHELLHOOKMESSAGE<>0 then RegisterShellHook(MainWnd, 3);
SendMessage(GetDesktopWindow, $400, 0, 0);
SetShellWindow(MainWnd);
//------------------------------------------------
и потом ловит просто WM_SHELLHOOKMESSAGE..........
if msg=WM_SHELLHOOKMESSAGE then
begin
case wparam of
HSHELL_WINDOWCREATED:
HSHELL_WINDOWDESTROYED:
HSHELL_WINDOWACTIVATED:
.........................
← →
jonni (2003-08-22 16:26) [4]po povodu peredat" HWND v dllku
library SHELL;
type
PHookRec = ^THookRec;
THookRec = packed record
MainWindow: HWND;
ShellHookID: HHOOK;
end;
procedure SetMainHandle(wndHandle: HWND); export;
procedure SetMainHandle(WndHandle: HWND);
begin
rHookRec^.MainWindow := wndHandle;
end;
nu a dlya rHookRec(ya pravda ne ochen" ponimayu no bez etogo u menya ne rabotaet:(()
//--------------
const MMFName="myhook";
procedure EntryPointProc(Reason: Integer);
var
hMapObject: THandle;
begin
hMapObject := 0;
case reason of
DLL_PROCESS_ATTACH:
begin
hMapObject := CreateFileMapping(INVALID_HANDLE_VALUE,
nil,
PAGE_READWRITE,
0,
SizeOf(THookRec),
MMFName);
if hMapObject = 0 then
begin
MessageBox(0, "Can""t create FileMapping", "Message from Exampel2/Process2", 0);
exit;
end;
rHookRec := MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(THookRec));
if rHookRec = nil then
begin
CloseHandle(hMapObject);
MessageBox(0, "Can""t make MapViewOfFile", "Message from Exampel2/Process2", 0);
exit;
end;
end;
DLL_PROCESS_DETACH:
begin
try
UnMapViewOfFile(rHookRec);
CloseHandle(hMapObject);
except
end;
end;
DLL_THREAD_ATTACH:
begin
end;
DLL_THREAD_DETACH:
begin
end;
end; // case
end;
begin
DllProc := @EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
end.
← →
jonni (2003-08-22 16:28) [5]nu a vizov sootvetstvenno.......
unit Unit1
procedure SHELLSetMainHandle; external "mSHELL.dll" name "SetMainHandle";
vizov: SHELLSetMainHandle(Form1.Handle);
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c