Форум: "WinAPI";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
ВнизНе срабатывает ловшука WH_SHELL... Найти похожие ветки
← →
Bes © (2005-11-13 19:30) [0]Уважаемые Мастера!
Идея такова - надо отловить создание и уничножение кона приложения ( ну когда его запускают).
Ловушка находится в DLL.
Обрабатываются
HSHELL_WINDOWCREATED и HSHELL_WINDOWDESTROYED
При запуске моей программы срабатывает HSHELL_WINDOWCREATED 1 раз (я так понимают от моей же программы) и все... никакой дальнейшей реакции на создание/уничтожения окон.
Что интересно, данная библиотека прекрасно работала под Win2000 (у меня же WinXp SP2).
В интернете почитал - такая ситуация бывает когда explorer не является шеллом, т.е. какая -то сторонняя оболочка.
Странно, т.к. у меня explorer является облочкой.
В чем может быть проблема?
← →
DVM © (2005-11-14 11:15) [1]
library Hooks;
{$R *.res}
uses
Windows, Messages;
procedure SetHooks(hWndMain: HWND); export; forward;
procedure RemoveHooks; export; forward;
exports
SetHooks name "SetHooks",
RemoveHooks name "RemoveHooks";
const
MY_WINDOWCREATED = WM_USER + 100;
MY_WINDOWDESTROYED = WM_USER + 101;
MY_WINDOWACTIVATED = WM_USER + 102;
MY_WINDOWREDRAW = WM_USER + 103;
MY_CHANGELANGUAGE = WM_USER + 104;
MY_GETMINRECT = WM_USER + 105;
MY_ACTIVATESHELLWINDOW = WM_USER + 106;
MMFName="D218D7A0-5A95-11D8-AC31-964D7C744830.mem";
type
PHookRec = ^THookRec;
THookRec = packed record
MainWindow: HWND;
ShellHookID: HHOOK;
end;
var
rHookRec: PHookRec = nil;
hMapObject: THandle = 0;
//------------------------------------------------------------------------------
function ShellHookProc(nCode: Integer; WPARAM: wParam; LPARAM: lParam): LResult; stdcall;
begin
if nCode >= 0 then
if rHookRec^.MainWindow <> 0 then
case nCode of
HSHELL_REDRAW : PostMessage(rHookRec^.MainWindow, MY_WINDOWREDRAW, wParam, lParam);
HSHELL_WINDOWCREATED : PostMessage(rHookRec^.MainWindow, MY_WINDOWCREATED, wParam, lParam);
HSHELL_WINDOWDESTROYED : PostMessage(rHookRec^.MainWindow, MY_WINDOWDESTROYED, wParam, lParam);
HSHELL_WINDOWACTIVATED : SendMessage(rHookRec^.MainWindow, MY_WINDOWACTIVATED, wParam, lParam);
HSHELL_LANGUAGE : PostMessage(rHookRec^.MainWindow, MY_CHANGELANGUAGE, wParam, lParam);
HSHELL_ACTIVATESHELLWINDOW : PostMessage(rHookRec^.MainWindow, MY_ACTIVATESHELLWINDOW, wParam, lParam);
end;
result := CallNextHookEx(rHookRec^.ShellHookID, nCode, wParam, lParam);
end;
//------------------------------------------------------------------------------
procedure SetHooks(hWndMain: HWND);
begin
if hWndMain = 0 then exit;
rHookRec^.MainWindow := hWndMain;
rHookRec^.ShellHookID := SetWindowsHookEx(WH_SHELL, @ShellHookProc, hInstance, 0);
end;
//------------------------------------------------------------------------------
procedure RemoveHooks;
begin
UnHookWindowsHookEx(rHookRec^.ShellHookID);
end;
//------------------------------------------------------------------------------
procedure EntryPointProc(Reason: Integer);
begin
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", "Error!", 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", "Error!", 0);
exit;
end;
end;
DLL_PROCESS_DETACH:
begin
UnMapViewOfFile(rHookRec);
CloseHandle(hMapObject);
end;
end; // case
end;
//------------------------------------------------------------------------------
begin
DllProc := @EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
end.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.053 c