Главная страница
    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.112 c
4-89644
ShadoWFM
2003-08-20 19:54
2003.10.27
Непонятная функйия


3-89162
Игоряныч
2003-10-07 08:17
2003.10.27
MS SQL Server и ADO в делфи ???


9-89086
xman
2003-04-16 10:52
2003.10.27
Help!


8-89395
Andrey02
2003-06-21 13:57
2003.10.27
иконка ICO в приложении


1-89220
dubrovskiy
2003-10-14 16:51
2003.10.27
DLL в С++





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