Как сделать чтобы одно окно было поверх другого


Форум: "WinAPI";
Поиск по всему сайту: www.delphimaster.net;
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];

Вниз

Как сделать, чтобы окно приложения было поверх всех окон 


Thinker   (2004-05-01 23:31) [0]

Привет всем! Как сделать, чтобы окно приложения было поверх всех окон? Такое свойство можно указывать в некоторых приложениях.
Мне это нужно для создания таймера для интернет клуба.


DVM ©   (2004-05-01 23:46) [1]

SetWindowPos() + HWND_TOPMOST + частый-частый таймер


Урод   (2004-05-01 23:51) [2]

А так не пойдет?

procedure TForm1.Timer1Timer(Sender: TObject);
begin
       FormStyle:=fsStayOnTop;
end;


DVM ©   (2004-05-01 23:56) [3]


> А так не пойдет?

Не пойдет. Так ему для клуба надо. Любая игра свернет такое окно. Без таймера не обойтись тут.


имя   (2004-05-02 22:32) [4]

Удалено модератором


Thinker   (2004-05-02 23:17) [5]

To Deff++
а когда срабатывает OnIdle


Thinker   (2004-05-07 23:10) [6]


> А так не пойдет?
>
> procedure TForm1.Timer1Timer(Sender: TObject);
> begin
>        FormStyle:=fsStayOnTop;
> end;

Не получается :( Когда запускаю игрушки, то окна не видно.
----------------------------------------------------------

> > А так не пойдет?
>
> Не пойдет. Так ему для клуба надо. Любая игра свернет такое
> окно. Без таймера не обойтись тут.

Урод привёл пример с таймером (ты не заметил)
----------------------------------------------------------
И то, что писал Deff++ помоему не выходит. Я сделал процедуру, которая вызываеться на OnIdle и в ней прописал FormStyle := fsStayOnTop. Но OnIdle не в то время срабатывает :(
Я сделал fsStayOnTop на событие приложения OnDeactivate, но даже в этом случае ничего не получалось....

Если можно, то привидите пример... Заранее благодарен

                           Thinker


Игорь Шевченко ©   (2004-05-08 00:08) [7]

SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE) хоть по таймеру, хоть по Deactivate


имя   (2004-05-08 00:43) [8]

Удалено модератором


DVM ©   (2004-05-08 01:14) [9]

Вообще то для компьютерного клуба будет еще лучше в дополнение к [7] либо сворачивать все окна, кроме своего при блокировке, либо вообще убивать процессы окон. А то некоторые настырные игры все равно перекрыть не получится. К тому же при простом перекрытии своим окном других остается возможность пользоваться клавиатурой и т.д., что позволяет, например, продолжать слушать музыку или даже наощупь выполнять некоторые деструктивные действия.
Если все происходит под 2000/XP, то самое надежное - переключить десктоп на свой (предварительно созданный) - 100% надежно. По крайней мере в текущих версиях Windows.


Thinker   (2004-05-08 22:31) [10]

2 Игорь Сейчас попробую...

2 DVM Буду очень признателен, если поможешь с блокировкой. Я сам думал, что разверну форму на весь экран и сделаю BorderStyle = bsNone, но в этом случае надо кнопку Windows перекрыть...

Если есть варианты лучше( я уверен, что они есть :) ), то буду рад, если мне помогут :)


Thinker   (2004-05-10 04:17) [11]

Полностью окно не видно оно еле еле мерцает :(


Beglec   (2004-05-10 07:42) [12]

1. Если ты хочешь сообщать инфу клиенту во время игры - например сколько до конца сеанса осталось, то пиши прямо на экран [Объект Screen]
2. Скрываешь все окна растягиваешь свое главное окно на весь экран - иначе ни как. Можно сделать хитрее для Win XP  - Transperent 100% $))) народ долго мучается.

3. А вообще это довольно хлопотная вещь писать действительно хорошую программу для клуба. А маленькую фуфляндию любой молодой компьютерщик заломит убивая процесс


apihelp   (2004-05-10 21:53) [13]

>Игорь Шевченко ©  (08.05.04 00:08) [7]

>SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or
>SWP_NOMOVE) хоть по таймеру, хоть по Deactivate

with Form2 do
SetWindowPos(Handle, HWND_TOPMOST, 0, 0,
0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);

Так будет правильнее


apihelp   (2004-05-11 08:16) [14]

>Мне это нужно для создания таймера для интернет клуба.
>2. Скрываешь все окна растягиваешь свое главное окно на весь
>экран - иначе ни как.
А не лучше ли отключить клаву и мышь?

Да простят меня юзеры того клуба

WinExec("rundll32 mouse,disable",1);
WinExec("rundll32 keyboard,disable",1);


Роман   (2004-05-11 08:59) [15]

У вас будут еще проблемы с таймером. Т.к. многие игрухи работают с приоритетом REALTIME, то вы рискуете вообще ничего не проконтролировать при 100% загрузке проца. Поэтому надо создать мультимедиа-таймер и поток с приоритетом REALTIME, который будет его держать.


Thinker   (2004-05-14 23:05) [16]


> 1. Если ты хочешь сообщать инфу клиенту во время игры -
> например сколько до конца сеанса осталось, то пиши прямо
> на экран [Объект Screen]

Я не умею писать на экран:( Поможете? Буду очень благодарен


> WinExec("rundll32 mouse,disable",1);
> WinExec("rundll32 keyboard,disable",1);

У меня пишется, что такие ДЛЛ не найдены! Может это зависит от версий виндоус????


Thinker   (2004-05-18 23:54) [17]

Удалено модератором
Примечание: Создание пустых сообщений


Thinker   (2004-05-23 05:34) [18]

Beglec, apihelp где вы? Помогите!


apihelp   (2004-05-23 08:41) [19]

>Thinker  (23.05.04 05:34) [18]
>Beglec, apihelp где вы? Помогите!

Я так понимаю сервер будет активировать дочернею форму, которая перекроет экран.(Считаю такой подход не эффективным). Ну, хозяин барин.
Итак на форму 2.
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm2 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Button2: как сделать чтобы одно окно было поверх другого TButton;
   Label1: TLabel;
   procedure Button2Click(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure FormDeactivate(Sender: TObject);
 private
 procedure CreateParams(var Params: TCreateParams); override;
 public
   { Public declarations }
 end;

var
 Form2: TForm2;

implementation

uses killserver;

{$R.dfm}

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.WndParent := GetDesktopWindow;
end;

{---------------------}
procedure TForm2.FormDeactivate(Sender: TObject);
begin
SetWindowPos(Application.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE); //Данную функцию не в обяз писать на данную процедуру поскольку функция применяется единожды для перевода формы в режим TOPMOST и действует до закрытия формы.На On create будет также актуально. Убей не пойму, зачем нужен таймер?
end;

Код позволит держать дочернюю форму поверх всех окон.
Еще насчет таймера: Таймер созданный в потоке с высоким приоритетом будет конечно посылать форме команду "наверх" но форма то создана в потоке с более низким приоритетом по сему и управления она не получит.(при realtime)
Хотя правильно чел сказал, что поток с приоритетом Realtime (хотя такой приоритет использовать для приложений (любых) не рекомендуется)Не позволит вашей проги получить время проца, если ее (вашей проги) приоритет не есть realtime. Хотите реалтайм создавайте поток с данным приоритетом и создавайте в нем динамически форму. Только вот как вы ее закроете потом? Если даже мышь не получит управления. Посему лучше использовать поток с приоритетом пониже.
Помните, что для того чтобы успешно закрыть/открыть форму с приоритетом реалтайм нужно что бы и сервер (он принимает/выполняет команды клиента) также имел приоритет реалтайм, в противном случае он неполучает процессорное время.

Насчет вкыл.выкл клавы есть способы получше советую создать отдельную тему.


apihelp   (2004-05-23 08:45) [20]

apihelp  (23.05.04 08:41) [19]
Плиз простите строки:
Edit1: TEdit;
 Button1: TButton;
 Button2: TButton;
 Label1: TLabel;
 procedure Button2Click(Sender: TObject);
 procedure Button1Click(Sender: TObject);
исключить. Код взял из своей проги.


Thinker   (2004-05-25 01:56) [21] одно

To apihelp При запуске игры форма не видна %(


Федор Т   (2004-05-26 11:40) [22]

Уважаемые мастера, скажите пожалуста, а можно ли вообще перекрыть игру? Она как я понимаю использует полноэкранный режим.


apihelp   (2004-05-26 16:46) [23]

SetWindowPos(Application.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE); пиши на oncreate но все равно оно будет мелькать.
Еще попробуй это по таймеру:
InvalidateRect(Handle, nil, true);\ перересует форму
А у тебя когда окно фокус получает игра сворачивается?


Werewolf   (2004-05-26 18:20) [24]

На самом деле в Delphi есть маленькая ошибка, которая ломает всю надежность

FormStyle:=fsStayOnTop;

но если в обработчик форма в OnPaint вставить

Application.RestoreTopMosts;

все будет нормально, и никто твое приложение не свернет, только если специально обратившись к Application.Minimize, ну а это всегда можно отловить.


Федор Т   (2004-05-26 22:05) [25]

Werewolf  (26.05.04 18:20) [24]
Да форму то поверх всех расположить не сложно
ИМХО API"шной функцией куда элегантней.
Думал енто дело плевое, а нет, не хочет оно (окно) нормально отображаться поверх 3D игры. Даже по таймеру заставляю перерисоватся толку мало, просто заметней мелькает. Может просто игра такая, скорей всего нет. Ну ладно думаю пусть сворачивается, пытаюсь программно передавать фокус вновь созданному окну, и тут блин ограничения на получения фокуса в К2. То есть окно получает фокус, выводится наверх, а вот фокус ввода хрен. Остается юзать SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, 0, 0); а хочется SendMessage. Подскажите плиз способ передать фокус ввода форме в вин2000?


Форум: "WinAPI";
Поиск по всему сайту: www.delphimaster.net;
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];

Наверх

Память: 0.78 MB
Время: 0.073 c



Рекомендуем посмотреть ещё:


Закрыть ... [X]

Как сделать так, чтобы окно было всегда поверх других окон Как постелить линолеум на бетонный пол своими руками

Как сделать чтобы одно окно было поверх другого Как сделать, чтобы окно приложения было поверх всех окон
Как сделать чтобы одно окно было поверх другого Как сделать, чтобы окно, было всегда поверх других окон
Как сделать чтобы одно окно было поверх другого Как сделать так, чтобы одни окна были поверх других на
Как сделать чтобы одно окно было поверх другого Как сделать чтобы окно скайпа было поверх всех окон
Как сделать чтобы одно окно было поверх другого Как окно сделать поверх всех окон: простые решения
Как сделать чтобы одно окно было поверх другого Вегетарианская жареная рыба в кляре - оригинальный рецепт
Как сделать чтобы одно окно было поверх другого Виды навесов для дома и
Как сделать чтобы одно окно было поверх другого Воспаление и опухание десны вокруг зуба мудрости