![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хуки
NoSilence © (2010-06-11 21:04:00)Задача:
Написать .dll с панелью. Эта панель будет запускаться другой программой, передавая ей хэндл чужого окна. Панель должна следовать, сворачиваться и разворачиваться с этим окном.
Я знаю, что это делается через хуки. Написал все это дело. Сделал проверку на активацию окна. Все было круто, пока не передал хэндл чужого окна. В интернете я прочитал, что для глобального хендла нужна отдельная dll с хуком. Собственно вопрос в том, как мне это все оформить?
Создал длл с кодом:
library Control;
uses
Windows;
var
Hook: HHook;
hPanel, hClient: HWND;
function HookProc(nCode: integer; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall;
begin
result:= CallNextHookEx(Hook, nCode, wParam, lParam);
if wParam = hClient then
case nCode of
HCBT_ACTIVATE: ShowWindow(hPanel, SW_SHOWNOACTIVATE);
{ HCBT_MOVESIZE: begin
GetWindowRect(hClient, ClientRect);
SetWindowPos(hPanel, hClient,
ClientRect.Left, ClientRect.Top,
Width, Height, HWND_TOPMOST);
end;
// HCBT_SYSCOMMAND: MessageBox(hPanel, pchar(inttostr(lParam)), 0, MB_OK); }
end;
end;
procedure HookOn(OnOff: boolean; Panel, Client: HWND); stdcall;
begin
hPanel:= Panel;
hClient:= Client;
if OnOff then
Hook:= SetWindowsHookEx(WH_CBT, @HookProc, HInstance, 0)
else
UnhookWindowsHookEx(Hook);
end;
exports HookOn;
begin
end.
И патался передать ей hookproc из длл панели, но ничего не получилось. Возможно я что-то делаю не так. Именно за этим я и обратился за помощью. Потом решил передать в длл хука хэндлы окон (код выше).
HDLL:= LoadLibrary(PChar('control.dll'));
if HDLL > HINSTANCE_ERROR then begin
@HookOn:= GetProcAddress(HDLL, 'HookOn');
HookOn(true, hPanel, hClient);
end;
Раньше хотя для своего окна срабатывал хук, теперь вообще не работает. hClient - существует и передается с главной формы.
NoSilence (2010-06-11 22:29:00) [1]Нет, как определить что окно сместилось через хук и в проце перетащить дополнительное окно?
NoSilence (2010-06-11 22:29:00) [2]мл*, походу проще поставить таймер с проверкой координат...
KilkennyCat (2010-06-11 21:56:00) [3]топ, лефт.
NoSilence (2010-06-11 21:23:00) [4]извиняюсь. нашел статью с примерами, где все работает. поэтому другой вопрос, как мне двигать окно за другим?