Главная страница
    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.06 c
1-1134852322
Andron.Ru
2005-12-17 23:45
2006.01.22
ACD FotoAngelo Структура????


2-1136472197
noname:))
2006-01-05 17:43
2006.01.22
Потоки и методы работы с ними.


6-1129122090
Piero
2005-10-12 17:01
2006.01.22
ClientSocket


14-1135538589
Ihor Osov'yak
2005-12-25 22:23
2006.01.22
Есть пробел в знаниях.


2-1136214464
JEK2
2006-01-02 18:07
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский