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

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.036 c
4-1126252766
Андрей Жук
2005-09-09 11:59
2005.11.13
Работа с национальными клавиатурами


14-1129789532
Дмитрий_Б
2005-10-20 10:25
2005.11.13
Руководство Oracle на русском языке


3-1127007130
Fedia
2005-09-18 05:32
2005.11.13
Использование не DB компонента на DBCtrlGrid.


14-1129888989
konda
2005-10-21 14:03
2005.11.13
Глюки при загрузке компьютера


14-1129871656
Ega23
2005-10-21 09:14
2005.11.13
С днем рождения! 21 октября





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