Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.12;
Скачать: CL | DM;

Вниз

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

 
markers ©   (2009-02-19 09:00) [0]

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


 
Palladin ©   (2009-02-19 09:02) [1]

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


 
markers ©   (2009-02-19 09:11) [2]

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


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

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


 
markers ©   (2009-02-19 10:05) [4]


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

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


 
markers ©   (2009-02-19 10:28) [5]

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


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


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


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


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


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

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


 
markers ©   (2009-02-19 12:55) [8]

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


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

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


 
markers ©   (2009-02-19 15:25) [10]

Спасибо!


 
markers ©   (2009-02-20 05:47) [11]

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

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


 
markers ©   (2009-02-24 10:48) [12]

Здраствуйте снова!
Вроде разобрался с хуками, всё работало (на 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-24 10:58) [13]

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


 
markers ©   (2009-02-24 12:02) [14]

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


 
markers ©   (2009-02-24 12:25) [15]

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


 
DVM ©   (2009-02-24 12:36) [16]


> markers ©

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

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



Страницы: 1 вся ветка

Текущий архив: 2009.04.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
15-1234347409
KSergey
2009-02-11 13:16
2009.04.12
Про стандартный FireWall Windows


2-1235313411
ViK_Tor
2009-02-22 17:36
2009.04.12
Запретить редактирование данных в готовой программе ADO + Access?


6-1202034089
sAshA20
2008-02-03 13:21
2009.04.12
Фильтрация пакетов


2-1235559158
Footballer
2009-02-25 13:52
2009.04.12
Отправка e-mail


15-1234336329
Германн
2009-02-11 10:12
2009.04.12
справочник по Си