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

Вниз

Не срабатывает ловшука 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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.029 c
14-1135671516
ronyn
2005-12-27 11:18
2006.01.22
paramstr


14-1135441129
Витёк
2005-12-24 19:18
2006.01.22
Факториал больших чисел!


2-1136021227
BVV
2005-12-31 12:27
2006.01.22
ADOTable


3-1132822268
Drizhenko
2005-11-24 11:51
2006.01.22
Пингование по базе данных


14-1135848534
Игорь Шевченко
2005-12-29 12:28
2006.01.22
Как не надо программировать