Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.011 c
1-89235
BillyJeans
2003-10-14 13:59
2003.10.27
Маленький вопросик по ListView...


4-89630
Oxy
2003-08-23 21:43
2003.10.27
Как DDL-ке выгрузить себя саму?


7-89595
aj_ua
2003-08-13 14:49
2003.10.27
Как перегрузить компьютер с коммандной строчки?


3-89096
Добра_желатель
2003-10-08 14:19
2003.10.27
Зацените


14-89544
Mystic
2003-10-08 12:42
2003.10.27
Забавный глюк :)





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