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

Вниз

Окно StayOnTop   Найти похожие ветки 

 
harisma ©   (2010-06-25 16:48) [0]

Есть многооконное хост-приложение, к которому подгружаются библиотеки в DLL. В каждой библиотеке есть отдельный поток (помимо всего остального) с формой, которая при выполнении потока отображается поверх всех модальных форм хост-приложения.
Когда выполнение потока в одной библиотеке заканчивается, соответственно форма разрушается и управление передается на следующую библиотеку, где запускается такой же поток с такой же формой, которая опять же отображается поверх всех модальных форм хост-приложения и т. д.

Данный процесс инициируется пользователем и жизненно необходим для работы всего приложения.

Так вот вопрос и собственно проблема: Как сделать так, чтобы эта форма, которая должна находиться поверх всех модальных окон моего приложения, тем самым перекрывая доступ пользователю к элементам управления приложения до завершения работы потока, влияла только на мое приложение, а не на все открытые окна в ОС? А то получается, что запустил процесс в своем приложении, перключился в другую программу и работаешь там себе, а в это время поток в одной библиотеке завершил работу, управление передалось в следующую библиотеку и вновь форма отображения процесса выполнения потока вылезла на передний план операционки, став главным активным окном. Мне же надо, чтобы эта форма не перехватывала управление на себя, а спокойно в фоновом режиме работало себе, не давая в то же самое время пользователю извне вмешаться в работу приложения.

Ну, что-то типа такого. Простите зе несколько невнятное описание, но думаю суть понятна.


 
Игорь Шевченко ©   (2010-06-25 19:40) [1]


> Как сделать так, чтобы эта форма, которая должна находиться
> поверх всех модальных окон моего приложения, тем самым перекрывая
> доступ пользователю к элементам управления приложения до
> завершения работы потока, влияла только на мое приложение,
>  а не на все открытые окна в ОС?


SetWindowPos (Handle, HWND_TOP, ...


 
~AQUARIUS~ ©   (2010-06-26 00:06) [2]

http://www.transl-gunsmoker.ru/2010/06/blog-post_11.html


 
_Юрий ©   (2010-06-26 15:04) [3]

видимо, просто не нужно эту форму делать активной при показе


 
Deltas ©   (2010-06-26 20:19) [4]


> Как сделать так, чтобы эта форма, которая должна находиться
> поверх всех модальных окон моего приложения, тем самым перекрывая
> доступ пользователю к элементам управления приложения

Расширенный стиль окна WS_EX_TOPMOST не блокирует другие окна приложения. Если есть исходный код библиотеки, то можно перед отображением окна вызвать функцию DisableTaskWindows() из Forms.pas:
WindowList := DisableTaskWindows(0);
В этом случае, при разрушении окна (WM_DESTROY) или закрытии окна (WM_CLOSE), нужно вызвать
EnableTaskWindows(WindowList);


 
harisma ©   (2010-06-29 18:36) [5]


> Расширенный стиль окна WS_EX_TOPMOST не блокирует другие
> окна приложения. Если есть исходный код библиотеки, то можно
> перед отображением окна вызвать функцию DisableTaskWindows()
> из Forms.pas:
> WindowList := DisableTaskWindows(0);
> В этом случае, при разрушении окна (WM_DESTROY) или закрытии
> окна (WM_CLOSE), нужно вызвать
> EnableTaskWindows(WindowList);

А можно вот это поподробнее?
Если я правильно понял, то перед вызовом метода этой формы ShowModal я должен сделать вызов DisableTaskWindows(0), а после ее закрытия (метод Free) вызвать EnableTaskWindows(). И все? Больше ничего делать не надо?


 
Deltas ©   (2010-06-29 19:16) [6]

Если Вы посмотрите исходный код ShowModal(), то увидите, что эта функция уже использует DisableTaskWindows() и EnableTaskWindows(). Но, функция DisableTaskWindows() вызывает EnumThreadWindows() для перечисления всех окон потока(!!!). Таким образом, DisableTaskWindows() может заблокировать только окна потока, из которого была вызвана. Поэтому

> Если я правильно понял, то перед вызовом метода этой формы
> ShowModal я должен сделать вызов DisableTaskWindows(0),
> а после ее закрытия (метод Free) вызвать EnableTaskWindows().
>  И все?

не даст желаемого результата, потому что у Вас окна в DLL создаются в своих потоках, если я правильно понял. Вместо этого, как вариант, перед созданием окна "блокирующего другие окна приложения", можно отправить сообщение главному окну приложения, в обработчике которого вызвать DisableTaskWindows(). Тогда все окна главного потока будут заблокированы.
Но, в Вашей модели приложения, с моей точки зрения, изначально заложена мина. Дело в том, что компоненты VCL не потокобезопасны, другими словами, концепция Borland такова, что все окна и визуальные компоненты должны работать только в главном потоке. Кстати, это ограничение введено Borland, потому что на уровне Win API окна могут быть созданы различными потоками.


 
harisma ©   (2010-06-30 10:42) [7]


> Deltas ©   (29.06.10 19:16) [6]

Ваш ответ понятен. Спасибо. Будем думать, как это побороть :)



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
2-1315253407
Captcha
2011-09-06 00:10
2011.12.18
Программный выбор элемента в ComboBox


4-1219926981
tytus
2008-08-28 16:36
2011.12.18
Захват текста консольного приложения


2-1315504959
x2088
2011-09-08 22:02
2011.12.18
Системное меню окна


2-1315648401
Pushok
2011-09-10 13:53
2011.12.18
При закрытии Delphi вылетает AV


1-1277656298
DeusNoxious
2010-06-27 20:31
2011.12.18
Интерактивный Google maps