Форум: "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