Форум: "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