Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];

Вниз

Окно 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
2-1315554871
Andrey K
2011-09-09 11:54
2011.12.18
ActiveControl


15-1314822593
Юрий
2011-09-01 00:29
2011.12.18
С днем рождения ! 1 сентября 2011 четверг


6-1248848880
Sonoleo
2009-07-29 10:28
2011.12.18
МЭК 80670-5-104


2-1315739001
я
2011-09-11 15:03
2011.12.18
ftGraphic, DBGrid,ClientDataSet,DataSource


15-1314915157
картман
2011-09-02 02:12
2011.12.18
посоветуйте UPS





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский