Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.032 c
2-1136206489
Rubey
2006-01-02 15:54
2006.01.22
Строка в StringGrid


2-1135693185
stocker
2005-12-27 17:19
2006.01.22
Динамический PageControl и TabSheet


14-1135398238
Дремучий
2005-12-24 07:23
2006.01.22
А надо ли делать автоматическое Windows Update?


3-1132653380
ShiFT
2005-11-22 12:56
2006.01.22
получение BLOBField в Потоке.


5-1123089950
Juice
2005-08-03 21:25
2006.01.22
Сохранение свойства-обьект





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