Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
2-1235468723
Korbit
2009-02-24 12:45
2009.04.12
Получить данные S.M.A.R.T от HDD


2-1235628148
CodeMaster
2009-02-26 09:02
2009.04.12
TListBox and DrawItem


11-1198514617
tim128
2007-12-24 19:43
2009.04.12
Обработка событий под wince


15-1234287680
Маэстро
2009-02-10 20:41
2009.04.12
Сколько это будет стоить?


2-1235165863
Mops
2009-02-21 00:37
2009.04.12
TWebBrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский