Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Хук на активизацию окон [D6, WinXP]


Mr tray ©   (2006-06-01 13:09:00) 

Здорово всем! Ребята, кто знает, как можно сделать хук на активизацию окон. А то WH_GETMESSAGE с WM_ACTIVATE не работает.


Сашка   (2006-07-05 13:18:00) [1]

Ребят, привет всем! Нужна помощь
Окна у меня активизвруются при наведении курсора, без щелчка мыши..
Скалько не искал, никак не могу убрать (винда ХР)
Спасибо заранее


DVM   (2006-06-08 10:16:00) [2]

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.


Игорь Шевченко   (2006-06-08 10:09:00) [3]


> Что значит top-level, unowned window?


Которое на Taskbar'е отображается.


> Где инициализируется DLL с хуком на активизацию окон, выполненным
> с помощью WH_SHELL?


Там же, где и с любым другом хуком, при загрузке в адресное пространство процесса.


Mr tray   (2006-06-07 18:03:00) [4]

И ещё. Где инициализируется DLL с хуком на активизацию окон, выполненным с помощью WH_SHELL?


Mr tray   (2006-06-07 17:58:00) [5]

И ещё. Вот что там написано (сайте мелкософта): The activation has changed to a different top-level, unowned window. Что значит top-level, unowned window?


Mr tray   (2006-06-07 17:45:00) [6]

спасибо.

> Выкинь хелп

Я подумаю над этим предложением


Игорь Шевченко   (2006-06-07 17:42:00) [7]

Mr tray   (07.06.06 17:35) [10]

Выкинь хелп

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/shellproc.asp


Mr tray   (2006-06-07 17:35:00) [8]

но в хелпе про HSHELL_WINDOWACTIVATED написано Windows 95 only а у меня XP


Leonid Troyanovsky   (2006-06-04 10:18:00) [9]


> Mr tray   (04.06.06 00:40) [8]
> использовать HSHELL_ACTIVATESHELLWINDOW?


HSHELL_WINDOWACTIVATED

--
Regards, LVT.


Mr tray   (2006-06-04 00:40:00) [10]

использовать HSHELL_ACTIVATESHELLWINDOW?


DVM   (2006-06-02 10:05:00) [11]


> почему лишняя?

Каждый раз когда будет вызываться оконная процедура любого окна в системе, этот вызов будет пропускаться через ловушку. Окон сотни, сообщений тысячи.

Активацию окна лучше отслеживать ловушкой WH_SHELL


Mr tray   (2006-06-01 23:52:00) [12]

почему лишняя?


DVM   (2006-06-01 17:06:00) [13]


> всё ОК. сделал с помощью WH_CALLWNDPROC и WM_ACTIVATE

нерационально, лишняя нагрузка на систему.


Mr tray   (2006-06-01 15:53:00) [14]

всё ОК. сделал с помощью WH_CALLWNDPROC и WM_ACTIVATE


Mr tray   (2006-06-01 15:48:00) [15]

а как с помощью WH_SHELL узнать хендл активируемого окна?


Mr tray   (2006-06-01 15:43:00) [16]

я тут пытаю WH_CALLWNDPROC c WM_ACTIVATE, но чего то не выходит. Вариант из Игорь Шевченко ©   (01.06.06 13:31) [1] лучше или хуже WH_CALLWNDPROC c WM_ACTIVATE. или это вообще разные вещи?


Игорь Шевченко   (2006-06-01 13:31:00) [17]

WH_SHELL


Наверх

Титульная страница Поиск, карта сайта Написать письмо