Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 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?



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

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

Наверх





Память: 0.52 MB
Время: 0.036 c
14-1087215146
D7
2004-06-14 16:12
2004.07.04
TextOut


4-1085298550
Dennisius
2004-05-23 11:49
2004.07.04
Собственный TaskBar


4-1085379431
Mamed
2004-05-24 10:17
2004.07.04
Udalenie faylov


14-1086376271
Копир
2004-06-04 23:11
2004.07.04
Один немецкий студент ежедневно, посещая Университет,


3-1086701484
АлекСандр
2004-06-08 17:31
2004.07.04
Ячейка DBGrida





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