Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.30;
Скачать: CL | DM;

Вниз

тИП ЛОВУШКИ?   Найти похожие ветки 

 
alex134 ©   (2002-12-10 17:22) [0]

Какой взять тип ловушки, чтобы отловить WM_SowWindow ?


 
alex134 ©   (2002-12-10 20:56) [1]

<<wm_ShowWindow


 
Song ©   (2002-12-10 21:06) [2]

WH_GETMESSAGE


 
alex134 ©   (2002-12-10 21:53) [3]

Делаю так:

library Hook1;

uses
Windows, SysUtils, Messages, MonitorMessage;

{$R *.res}

const
WM_USER = $0400; //
WM_KEYBHOOK = WM_USER + 346;
MMFName: PChar = "MyMMF"; // имя объекта файлового отображения

type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
WindowName : ShortString; // имя окна
WindowH: HWND; // дескриптор окна
ParentH: HWND;
MainIs : boolean;
MainH : HWND;
end;

var
KeyboardHook: HHOOK;
GlobalData: PGlobalDLLData;
MMFHandle: THandle;

function GetMsgProc(hCode: Integer; wParam: Longint; lParam: Longint): LRESULT; stdcall;
var
Wnd: THandle;
VMsg : ^MSG;
begin
VMsg:=Ptr(lParam);
if (hCode=HC_ACTION) and (VMsg^.message=wm_ShowWindow) then
begin
MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
if MMFHandle = 0 then
begin
wnd:=findwindow(nil, "freedomhook");
if wnd>0 then SendMessage(wnd,WM_KEYBHOOK, 0, 1);
end
else begin
GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
if GlobalData = nil then
begin
CloseHandle(MMFHandle);
wnd:=findwindow(nil, "freedomhook");
if wnd>0 then SendMessage(wnd,WM_KEYBHOOK, 0, 2);
end
else
begin
GlobalData^.WindowName:=MessageToStr(VMsg^.message);
GlobalData^.WindowH:=VMsg^.hwnd;
GlobalData^.ParentH:=0;
FlushViewOfFile(GlobalData, SizeOf(TGlobalDLLData));
wnd:=findwindow(nil, "freedomhook");
if wnd>0 then SendMessage(wnd,WM_KEYBHOOK, 0, 0);
end;
UnmapViewOfFile(GlobalData);
CloseHandle(MMFHandle);
end;
end;

Result := CallNextHookEx(KeyboardHook, hCode, wParam, lParam);
end;

function SetKeyboardHook1: Boolean; stdcall; export;
begin
KeyboardHook := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, HInstance, 0);
Result := KeyboardHook <> 0;
end;

function RemoveKeyboardHook1: Boolean; stdcall; export;
begin
Result := UnhookWindowsHookEx(KeyboardHook);
end;

exports SetKeyboardHook1, RemoveKeyboardHook1;

begin
end.

Сообщений wm_showwindow не возникает. Попробуйте сами :(


 
Almaz ©   (2002-12-11 00:53) [4]


> alex134 © (10.12.02 21:53)

Попробуйте WH_CALLWNDPROC.

Удачи.


 
melifaro ©   (2002-12-11 04:26) [5]

WH_CBT


 
alex134 ©   (2002-12-11 16:06) [6]

Не помогло. Я тут слышал у кого-то есть код отлова всех сообщений. Поделитесь исходником плз!


 
melifaro ©   (2002-12-12 04:09) [7]

Вот пример моего хука на создание окна из программы FileDog XP:

//FileDog XP hook by melifaro

library ShellHookXP;

uses
Messages,
Windows;

Const
WM_TOHOOKWND_0001 = WM_USER + 170;

var
DLLHandle : HHook;

function ParentWnd : hWnd;
Begin
Result := FindWindow( PChar( "THookContainer" ), nil );
End;

function myHook( nCode : Integer; wParam : WPARAM; lParam : LPARAM ) : LRESULT; stdcall;
Var
WndHandle : hWnd;
Name : Array [0..127] of char;
begin
if nCode = HCBT_CREATEWND then
If wParam <> 0 then
if GetWindow(wParam, gw_Owner) = 0 then
SendMessage ( ParentWnd, WM_TOHOOKWND_0001, wParam, lParam );
Result := CallNextHookEx( DLLHandle, nCode, wParam, lParam )
end;

function EnableBlock : Bool; stdcall;
Begin
if Result then DLLHandle := SetWindowsHookEx( WH_CBT, myHook, HInstance, 0 );
end;

Function DisableBlock : Bool; stdcall;
Begin
UnhookWindowsHookEx( DLLHandle );
end;

exports EnableBlock, DisableBlock;

Begin
end.


А вот собственно отрывок из программы FileDog XP:


Const
WM_TOHOOKWND_0001 = WM_USER + 170;

...

private
procedure GetHookHandle (var M : TMessage) ; message WM_TOHOOKWND_0001;

...

function EnableBlock : Bool; external "ShellHookXP.dll";
function DisableBlock : Bool; external "ShellHookXP.dll";

...

procedure THookContainer.GetHookHandle (var M : TMessage);
Var
PID : Cardinal;

begin
...
GetWindowThreadProcessID ( M.wParam, @PID ); //Получаем ID процесса, создавшего окно
...
End;

...
Initialization
EnableBlock;
finalization
DisableBlock;



Вот собственно и всё.
Только прога-то это shareware, так что с тебя пиво :)


 
alex134 ©   (2002-12-12 21:29) [8]

Спасибо, но я знаю как отлавливать создание окон. Мне надо отловить момент показа окна.


 
alex134 ©   (2002-12-14 00:00) [9]

up


 
Song ©   (2002-12-14 11:07) [10]

Где-то ты здесь наплёл..:

... and (VMsg^.message=wm_ShowWindow) then begin ...


 
alex134 ©   (2002-12-15 00:00) [11]


> Где-то ты здесь наплёл..:
>
> ... and (VMsg^.message=wm_ShowWindow) then begin ...

С этим все нормально - проверял


 
Song ©   (2002-12-15 09:08) [12]

Да наплёл, наплёл.. если не наплёл, тогда как-то странно ты сообщения вытаскиваешь..

Я бы сделал так: IF ... TMsg(Pointer(LParam)^).Message=WM_SHOWWINDOW ...

Зачем структура VMsg ?



Страницы: 1 вся ветка

Текущий архив: 2003.01.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
6-96927
serd_hhc
2002-12-01 04:59
2003.01.30
Как создать BROADCAST сообщение?


1-96794
Igit
2003-01-22 20:35
2003.01.30
Low_dword & High_dword


1-96786
AsSa
2003-01-23 01:21
2003.01.30
Minimize


14-97003
Шутник
2003-01-13 16:08
2003.01.30
Про лес


14-97008
Николай Быков
2003-01-10 11:04
2003.01.30
Может ли кто-нибудь объяснить?