Форум: "Начинающим";
Текущий архив: 2009.04.12;
Скачать: [xml.tar.bz2];
Вниз
Отлов сообщения при появлении/исчезновении окна. Найти похожие ветки
← →
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.pashttp://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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c