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