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

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

Хуки


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]

извиняюсь. нашел статью с примерами, где все работает. поэтому другой вопрос, как мне двигать окно за другим?


Наверх

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