Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.007 c
1-96711
DTK
2003-01-20 15:17
2003.01.30
Работа с рисунками


1-96857
Evgeniy K
2003-01-19 14:50
2003.01.30
Вопрос только для Мастеров/прикладных программистов.


14-97020
Temp
2003-01-13 10:18
2003.01.30
free proxy


3-96610
YurikV
2003-01-13 15:40
2003.01.30
MSSQL, SQL SERVER


1-96696
Jurij_ch
2003-01-22 00:54
2003.01.30
Стёрт *.pas файл, однако остались *.dfm, *.dfn и *.dcu





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