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

Вниз

Как сделать форму поверх всех приложений?   Найти похожие ветки 

 
Scordion   (2005-08-24 13:35) [0]

Здравствуйте Мастера возникла такая проблема, нужно сделать не главную форму поверх остальных т. к я читал, что дочерние окно не может быть выше главного то значит, что нужно разъединить 1 форму и эту. В общем, задача написать плавающие окно как, например в регет и мне осталось только сделать его поверх остальных.
Прошу вас о помощи


 
Игорь Шевченко ©   (2005-08-24 13:41) [1]

{
 Модуль: 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.


 
Scordion   (2005-08-24 13:53) [2]

Большое спасибо все работает!!!


 
Scordion   (2005-08-24 22:25) [3]

Только я не заметил что почему то у меня в панеле задач стало и моя прога и название этого окошка как с этим бороться?


 
i-s-v ©   (2005-08-25 01:34) [4]

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) [5]

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 - почему бы им не воспользоваться...


 
Scordion   (2005-08-25 10:57) [6]

Хотя я не понмаю, у 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


при попытки сделать это программа вылетает с ошибкой


 
Плохиш ©   (2005-08-25 11:05) [7]


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;


 
psa247 ©   (2005-08-25 11:28) [8]


> Piter ©   (25.08.05 01:47) [5]
>
> какой смысл делать с помощью WinAPi над формами то, что
> есть в свойствах формы и так

Св-во FormStyle работает до тех пор, пока окно одно такое в системе.

> Игорь Шевченко ©   (24.08.05 13:41) [1]

Этот пример не спасает от окон со свойством fsStayOnTop
Может, попробовать так:
1) FormStyle:= fsStayOnTop
2) По таймеру получать HWND верхнего окна, минимизировать его и ставить свое


 
Игорь Шевченко ©   (2005-08-25 12:29) [9]


> Этот пример не спасает от окон со свойством fsStayOnTop


Спасает.


 
psa247 ©   (2005-08-25 13:02) [10]

Скринсейверы и диспетчер задач это окно забивают.
Запустил форму СтейОнТор - свободно...


 
Piter ©   (2005-08-25 13:08) [11]

psa247 ©   (25.08.05 11:28) [8]
Св-во FormStyle работает до тех пор, пока окно одно такое в системе.


и что? Это правильно.

Есть как бы два "типа" окон - обычные и те, кто поверх всех, которые по мнению авторов программы должны быть вверху.

А ты прямо хочешь, чтобы твое было поверх-поверх-поверх всех? С чего ты решил, что так должно быть?

Тогда давайте пойдешь еще дальше, будем ставить хуки и отлавливать те окна, которые "вылезли" :)
А также перехватывать WinApi функции и исправлять стили у других окон.


 
psa247 ©   (2005-08-25 13:22) [12]


> А также перехватывать WinApi функции и исправлять стили
> у других окон

для

> Scordion

Кстати, тоже неплохой вариант
:)


 
psa247 ©   (2005-08-25 13:27) [13]


> исправлять стили у других окон

По-моему, TM по барабану, меняли ему стиль окна или нет...


 
Игорь Шевченко ©   (2005-08-25 14:38) [14]

Piter ©   (25.08.05 13:08) [11]


> Есть как бы два "типа" окон - обычные и те, кто поверх всех,
> которые по мнению авторов программы должны быть вверху.


И те, которые по замыслу должны быть сверху, находятся сверху друг друга в порядке создания окон.

psa247 ©   (25.08.05 11:28) [8]


> 2) По таймеру получать HWND верхнего окна, минимизировать
> его и ставить свое


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


 
Piter ©   (2005-08-25 15:12) [15]

Игорь Шевченко ©   (25.08.05 14:38) [14]
те, которые по замыслу должны быть сверху, находятся сверху друг друга в порядке создания окон


понятное дело. Вы создали программу с окном, которое поверх все. Другой создал программу, окно которой поверх всех. Чем ваше окно лучше? :)

Тут уж пользователь должен решать - какое окно ему лучше и какую программу запускать или пусть располагает так, чтобы не перекрывались.

А так действительно - какое-то соревнование - кто напишет так, чтобы его окно было самым-самым верхним.

Мне кажется неправильный подход.


 
psa247 ©   (2005-08-25 15:25) [16]


> Игорь Шевченко ©   (25.08.05 14:38) [14]


> Все программы, которые по таймеру выставляют себя поверх
> всех, должны находиться в корзине.

Ну зачем так жестоко, можно и на диск С:\


 
Игорь Шевченко ©   (2005-08-25 16:22) [17]

psa247 ©   (25.08.05 15:25) [16]


> Ну зачем так жестоко


Это не жестокость. Это справедливость.


 
psa247 ©   (2005-09-07 14:58) [18]

> Игорь Шевченко ©   (24.08.05 13:41) [1]
Как быть с MessageBox (окно их перекрывает)? Как-то не удобно.


 
Piter ©   (2005-09-07 18:55) [19]

ОТ нестандартных решений нечему удивляться нестандартным эффектам



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

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

Наверх




Память: 0.52 MB
Время: 0.04 c
14-1129842962
Ломброзо
2005-10-21 01:16
2005.11.13
Нордическая музыка


6-1122892321
Pool
2005-08-01 14:32
2005.11.13
Socket preconfig?


2-1129226653
Delphman
2005-10-13 22:04
2005.11.13
Сравнение двоичных чисел


4-1126611784
S@shka
2005-09-13 15:43
2005.11.13
Как заставить Windows не подключать мышь на Com-порте


2-1129543528
lodir
2005-10-17 14:05
2005.11.13
Преобразование ...