![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хук на активизацию окон [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