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

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

Отлов сообщения при появлении/исчезновении окна.


markers ©   (2009-02-19 09:00:00) 

Здраствуйте!
В программе есть список открытых (сторонних окон) и нужно этот список постоянно обновлять. Пока сделал через таймер, всё работает, но "некрасиво", решил сделать обновление списка окон по событиям..
А теперь вопрос: Как и какое сообщение отловить при создании / уничтожении окна? (Нужны только видимые)
Заранее спасибо!


DVM   (2009-02-24 12:36:00) [1]


> markers ©

Ты просил пример, я тебе его отправить не могу, письма возвращаются обратно. Что-то там у тебя перемудрено с почтой, где то в две тройки в адресе, где то три тройки.

Этому сообщению тут не место, но прошу не удалять его сразу.


markers   (2009-02-24 12:25:00) [2]

Счас скачал пример DLL перехвата CBT, всё перехватывает :( Буду переделывать под эту ДЛЛ счас. Если появятся мыли как исправить текущую библиотеку, пожалуйста отзовитесь!


markers   (2009-02-24 12:02:00) [3]

Счас ещё потестировал.... похоже не ставится хук на создание/уничтожение окна, а вот хук на активацию ставится! Что делать? Подскажите плиз!


markers   (2009-02-24 10:58:00) [4]

ЗЫ: Может быть проблема в том что моя программа используется одновременно несколькими пользователями а функция CreateAndInitOrOpenSharedFile в procs.pas может зарегистрировать только одно подключение?


markers   (2009-02-24 10:48:00) [5]

Здраствуйте снова!
Вроде разобрался с хуками, всё работало (на XP), и сегодня решил таки обновить прогу свою на сервере (Программа используется для замены стандартного Explorer`а для ограничения доступа, запускается при подключении через терминалку. Пользователь имеет права пользователя. Винда: Вин2003/R2/SP2). И почему-то ловушка толи не ставится толи не ловит сообщения (Нет возможности дебага на сервере). Пробовал потом запустить прогу под правами админа (под собой), проблема так-же. При этом при всём DLL занимается.
Вот исходник DLL:
http://rapidshare.com/files/201867737/wins_monitor.dpr.html
Длл не моя, я лишь немного переделал (Добавил сообщения).
Содержимое Procs.pas
http://rapidshare.com/files/201867912/procs.pas.html
Вызов в проге:
function SetHooks(Active: Boolean): Boolean; stdcall; external 'wins_monitor.dll' name 'SetHooks';
При показе формы:
CreateAndInitOrOpenSharedFile;
PProgData.WndMain := Handle;
SetHooks(True);

При уничтожении:
SetHooks(False);
PProgData.WndMain := 0;
CloseSharedFile;


Ловлю сообщения от DLL:

 private
   procedure OnHookAction(var Msg: TMessage); message HM_ACTION;

procedure TDesktop.OnHookAction(var Msg: TMessage);
var
  i:integer;
begin
 case THookAction(Msg.WParam) of
  ....
 end;
end;


Извиняюсь что пришлось выложить исходники на рапиду, т.к. форум данных по длинне не принимает, а и куда выложить исходник кроме как на рапиду не придумал.
Напомню, под XP всё работает хорошо! А вот под 2003 Ent R2 Rus SP2 нет. Понимаю что кода много для осознования, но помогите пожалуйста в чём может быть проблема?


markers   (2009-02-20 05:47:00) [6]

Решил ещё усовершенствовать эту ДЛЛку, захотел чтоб она ещё ловила события показа / скрытия формы, но не смог найти какие собщения при этом возбуждаются. Ловвлю такие сообщения:
HSHELL_WINDOWCREATED
HSHELL_WINDOWDESTROYED
HSHELL_WINDOWACTIVATED
HSHELL_REDRAW
HSHELL_GETMINRECT
HCBT_ACTIVATE
HCBT_CREATEWND
HCBT_MINMAX
WM_CLOSE
HCBT_SETFOCUS

Всё работает замечательно, сделал чтоб при этих всех событиях список окон не обновлялся с нуля, а добавлялись или убавлялись нужные пункты. Но не ловятся те программы у которых окно было скрыто (В трее сидят), а потом стало нескрытым и наоборот.
Заранее спасибо!


markers   (2009-02-19 15:25:00) [7]

Спасибо!


Сергей М.   (2009-02-19 12:59:00) [8]

Не забудь выставить при инициализации своей хук-либы переменную IsMultiThread в True, если в либе есть хотя бы одно явное или неявное обращение в BMM


markers   (2009-02-19 12:55:00) [9]

Ура! Всем спасибо! Разобрался! Всё пашет!


markers   (2009-02-19 10:43:00) [10]


> Сергей М. ©   (19.02.09 10:34) [6]
> > в основном хук ставится из ДЛЛ, а из самой проги нельзя?
> DLL обязательна для system-wide-хуков, за исключением WH_KEYBOARD/MOUSE_LL

Понял, спасибо! Нашёл тут у себя реализацию того чего надо в Hook.dll привязываю.


Сергей М.   (2009-02-19 10:34:00) [11]


> в основном хук ставится из ДЛЛ, а из самой проги нельзя?


DLL обязательнадля system-wide-хуков, за исключением WH_KEYBOARD/MOUSE_LL


markers   (2009-02-19 10:28:00) [12]

Нефига не ловит.... Я смотрю что в основном хук ставится из ДЛЛ, а из самой проги нельзя? (Пример где из самой: http://en.allexperts.com/q/Delphi-1595/setWindowsHookEx.htm) Мутил-мутил, срабатывал хук но только при запуске моего приложения, чужие не ловил. Сделал как в коде на приведённом сайте вообще перестал ловить.


markers   (2009-02-19 10:05:00) [13]


> Сергей М. ©   (19.02.09 09:15) [3]
> см. SetWindowsHookEx(WH_CBT, ..) -> HCBT_CREATEWND,  HCBT_DESTROYWND

Благадарю, уже начал рыть, уже даже вроде что-то ловит...


Сергей М.   (2009-02-19 09:15:00) [14]

см. SetWindowsHookEx(WH_CBT, ..) -> HCBT_CREATEWND,  HCBT_DESTROYWND


markers   (2009-02-19 09:11:00) [15]

Сторонних это к примеру браузер и вообще всё что угодно, любое окно.. Открывает невежно пользователь. Собственно список окон и работа с ним готова! Просто нужно сделать обновление этого списка по соббщениям винды открытия / закрытия какого-то окна.


Palladin   (2009-02-19 09:02:00) [16]

Сторонних это каких? Кто их открывает?


Наверх

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