![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать форму поверх всех приложений? [D7, WinXP]
Scordion © (2005-08-24 13:35:00)Здравствуйте Мастера возникла такая проблема, нужно сделать не главную форму поверх остальных т. к я читал, что дочерние окно не может быть выше главного то значит, что нужно разъединить 1 форму и эту. В общем, задача написать плавающие окно как, например в регет и мне осталось только сделать его поверх остальных.
Прошу вас о помощи
Piter (2005-09-07 18:55:00) [1]ОТ нестандартных решений нечему удивляться нестандартным эффектам
psa247 (2005-09-07 14:58:00) [2]> Игорь Шевченко © (24.08.05 13:41) [1]
Как быть с MessageBox (окно их перекрывает)? Как-то не удобно.
Игорь Шевченко (2005-08-25 16:22:00) [3]psa247 © (25.08.05 15:25) [16]
> Ну зачем так жестоко
Это не жестокость. Это справедливость.
psa247 (2005-08-25 15:25:00) [4]
> Игорь Шевченко © (25.08.05 14:38) [14]
> Все программы, которые по таймеру выставляют себя поверх
> всех, должны находиться в корзине.
Ну зачем так жестоко, можно и на диск С:\
Piter (2005-08-25 15:12:00) [5]Игорь Шевченко © (25.08.05 14:38) [14]
те, которые по замыслу должны быть сверху, находятся сверху друг друга в порядке создания окон
понятное дело. Вы создали программу с окном, которое поверх все. Другой создал программу, окно которой поверх всех. Чем ваше окно лучше? :)
Тут уж пользователь должен решать - какое окно ему лучше и какую программу запускать или пусть располагает так, чтобы не перекрывались.
А так действительно - какое-то соревнование - кто напишет так, чтобы его окно было самым-самым верхним.
Мне кажется неправильный подход.
Игорь Шевченко (2005-08-25 14:38:00) [6]Piter © (25.08.05 13:08) [11]
> Есть как бы два "типа" окон - обычные и те, кто поверх всех,
> которые по мнению авторов программы должны быть вверху.
И те, которые по замыслу должны быть сверху, находятся сверху друг друга в порядке создания окон.
psa247 © (25.08.05 11:28) [8]
> 2) По таймеру получать HWND верхнего окна, минимизировать
> его и ставить свое
Все программы, которые по таймеру выставляют себя поверх всех, должны находиться в корзине.
psa247 (2005-08-25 13:27:00) [7]
> исправлять стили у других окон
По-моему, TM по барабану, меняли ему стиль окна или нет...
psa247 (2005-08-25 13:22:00) [8]
> А также перехватывать WinApi функции и исправлять стили
> у других окон
для
> Scordion
Кстати, тоже неплохой вариант
:)
Piter (2005-08-25 13:08:00) [9]psa247 © (25.08.05 11:28) [8]
Св-во FormStyle работает до тех пор, пока окно одно такое в системе.
и что? Это правильно.
Есть как бы два "типа" окон - обычные и те, кто поверх всех, которые по мнению авторов программы должны быть вверху.
А ты прямо хочешь, чтобы твое было поверх-поверх-поверх всех? С чего ты решил, что так должно быть?
Тогда давайте пойдешь еще дальше, будем ставить хуки и отлавливать те окна, которые "вылезли" :)
А также перехватывать WinApi функции и исправлять стили у других окон.
psa247 (2005-08-25 13:02:00) [10]Скринсейверы и диспетчер задач это окно забивают.
Запустил форму СтейОнТор - свободно...
Игорь Шевченко (2005-08-25 12:29:00) [11]
> Этот пример не спасает от окон со свойством fsStayOnTop
Спасает.
psa247 (2005-08-25 11:28:00) [12]
> Piter © (25.08.05 01:47) [5]
>
> какой смысл делать с помощью WinAPi над формами то, что
> есть в свойствах формы и так
Св-во FormStyle работает до тех пор, пока окно одно такое в системе.
> Игорь Шевченко © (24.08.05 13:41) [1]
Этот пример не спасает от окон со свойствомfsStayOnTop
Может, попробовать так:
1)FormStyle:= fsStayOnTop
2) По таймеру получать HWND верхнего окна, минимизировать его и ставить свое
Плохиш (2005-08-25 11:05:00) [13]
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
if PreviewOnTop then
begin
Params.Style := Params.Style or WS_EX_TOPMOST;
Params.ExStyle := Params.ExStyle or WS_EX_TOOLWINDOW;
Params.WndParent := 0;
end;
end;
Scordion (2005-08-25 10:57:00) [14]Хотя я не понмаю, у VCL форм (коли в примерах они фигурируют, хотя конференция WinApi) есть свойство FormStyle - почему бы им не воспользоваться...
Да формстайл есть только когда я для своего окошка(form5) делаю его fsStayOnTop то оно становиться не поверх всех окон как мне нужно а только поверх главного окна
program prog;
...
.
..
var
ExtendedStyle : integer;
begin
ExtendedStyle := GetWindowLong(Application.Handle, GWL_EXSTYLE);
SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle or WS_EX_TOOLWINDOW);
Application.....
SetWindowLong
при попытки сделать это программа вылетает с ошибкой
Piter (2005-08-25 01:47:00) [15]i-s-v © (25.08.05 1:34) [4]
какой смысл делать с помощью WinAPi над формами то, что есть в свойствах формы и так
Scordion (24.08.05 22:25) [3]
Только я не заметил что почему то у меня в панеле задач стало и моя прога и название этого окошка как с этим бороться?
а это побочный эффект:
Игорь Шевченко © (24.08.05 13:41) [1]
назначение
родительским окном HWND_DEKSTOP.
Хотя я не понмаю, у VCL форм (коли в примерах они фигурируют, хотя конференция WinApi) есть свойство FormStyle - почему бы им не воспользоваться...
i-s-v (2005-08-25 01:34:00) [16]program prog;
...
.
..
var
ExtendedStyle : integer;
begin
ExtendedStyle := GetWindowLong(Application.Handle, GWL_EXSTYLE);
SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle or WS_EX_TOOLWINDOW);
Application.....
SetWindowLong
Scordion (2005-08-24 22:25:00) [17]Только я не заметил что почему то у меня в панеле задач стало и моя прога и название этого окошка как с этим бороться?
Scordion (2005-08-24 13:53:00) [18]Большое спасибо все работает!!!
Игорь Шевченко (2005-08-24 13:41:00) [19]
{
Модуль: PopupForm
Описание: Демонстрация возможности неглавной формы приложения быть поверх
всех окон в системе.
Используется простой способ: Управление стилем окна и назначение
родительским окном HWND_DEKSTOP.
Автор: Игорь Шевченко
Дата создания: 13.06.2002
История изменений:
}
unit PopupForm;
interface
uses
Windows, Messages, SysUtils,
{$IFDEF VER140}
Variants,
{$ENDIF}
Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfPopup = class(TForm)
AlwaysOnTopCheckBox: TCheckBox;
Edit1: TEdit;
procedure FormDestroy(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure AlwaysOnTopCheckBoxClick(Sender: TObject);
protected
procedure CreateParams (var Params: TCreateParams); override;
end;
var
fPopup: TfPopup;
implementation
{$R *.dfm}
procedure TfPopup.CreateParams (var Params: TCreateParams);
begin
inherited;
if AlwaysOnTopCheckBox.Checked then
with Params do begin
Style := (Style or WS_POPUP) and (not WS_CHILD);
WndParent := HWND_DESKTOP;
end;
end;
procedure TfPopup.FormDestroy(Sender: TObject);
begin
fPopup := nil;
end;
procedure TfPopup.FormActivate(Sender: TObject);
begin
if AlwaysOnTopCheckBox.Checked then
SetWindowPos (Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE OR SWP_NOSIZE);
end;
procedure TfPopup.AlwaysOnTopCheckBoxClick(Sender: TObject);
begin
RecreateWnd;
end;
end.