Как сделать форму поверх всех окон

Обновлено: 28.04.2024

Q: Как сделать так, чтобы форма была поверх всех окон кроме, как через formstyle = stayontop?

A: Вместо MyForm.Show:

Q: Как сделать так, чтобы форма была поверх всех окон кроме, как через formstyle = stayontop?

A: Вместо MyForm.Show:

Q: Как добавить в системное меню своей программы пунктик например, About) и как обрабатывать событие, когда пользователь его выбирает?

A: Добовляем пункт меню, в системное меню:

Q: Как добавить в системное меню своей программы пунктик например, About) и как обрабатывать событие, когда пользователь его выбирает?

A: Добовляем пункт меню, в системное меню:

Q: Как получить информацию о системе?

A: Структура SYSTEM_INFO содержит в себе информацию о системе компьютера. Информация включает в себя информацию об архитектуре и типе процессора, число процессоров в системе, информацию о размерах страниц а так же много другой информации. Более подробнее об этой структуре можно узнать в хэлпе или MSDN-е.

Q: Как получить информацию о системе?

A: Структура SYSTEM_INFO содержит в себе информацию о системе компьютера. Информация включает в себя информацию об архитектуре и типе процессора, число процессоров в системе, информацию о размерах страниц а так же много другой информации. Более подробнее об этой структуре можно узнать в хэлпе или MSDN-е.

Q: Как организовать поиск файла (функция FindFileInTree)?

A: LPSTR FindFileInTree(LPSTR szFile, LPSTR szDir, LPSTR szBuf, int cbBuf);

FindFileInTree ищет файл в директориях и суб дерикториях.

szFile - Имя файла
szDir - Так называемая директория верхнего уравня
szBuf - Указатель на выходной буфер содержащий пути
cbBuf - Длинна в байтах этого буфера

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

Q: Как организовать поиск файла (функция FindFileInTree)?

A: LPSTR FindFileInTree(LPSTR szFile, LPSTR szDir, LPSTR szBuf, int cbBuf);

FindFileInTree ищет файл в директориях и суб дерикториях.

szFile - Имя файла
szDir - Так называемая директория верхнего уравня
szBuf - Указатель на выходной буфер содержащий пути
cbBuf - Длинна в байтах этого буфера

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

Q: Как программно отключить клавиатуру и мышь?

A: Вызываем функцию из DLL'ки:

procedure BlockInput(ABlockInput: boolean); stdcall; external 'USER32.DLL';

Q: Как программно отключить клавиатуру и мышь?

A: Вызываем функцию из DLL'ки:

procedure BlockInput(ABlockInput: boolean); stdcall; external 'USER32.DLL';

Q: Как заблокировать и разблокировать CD-ROM?

CD_Lock(True) - блокирует CD-ROM
CD_Lock(False) - разблокирует CD-ROM

Для полного веселья можно заблокировать все CD-ROMы в системе через это:

Q: Как заблокировать и разблокировать CD-ROM?

CD_Lock(True) - блокирует CD-ROM
CD_Lock(False) - разблокирует CD-ROM

Для полного веселья можно заблокировать все CD-ROMы в системе через это:

Q: Как сделать снимок экрана (скриншот)?

A: Делаем скриншот всей рабочей области экрана:

Q: Как сделать снимок экрана (скриншот)?

A: Делаем скриншот всей рабочей области экрана:

Q: Как скопировать папку с подпапками и файлами в другое место?

A: Фукция копирует СОДЕРЖИМОЕ директории SourceDir в директорию TargetDir.
Копируются все файлы, подкаталоги, и файлы находящиеся в этих подкаталогах.

Аргумент StopIfNotAllCopied: если значение этого аргумента = True,
то при первой же ошибке копирования файла или папки, работы функции прекратится а функуция вернёт False. В случае если этот аргумент = False, то ошибки копирования учитываться не будут.

← →
Stalker01 © ( 2005-07-07 17:50 ) [0]

Как сделать форму, которая была бы поверх ВСЕХ остальных окон, делал sfStayOnTop, но при загрузки некоторых приложений, особено игр, форма все равно была под ними. Заранее спасибо.

← →
Алхимик © ( 2005-07-07 17:52 ) [1]

А что будет если запустить ДВЕ программы , формы которых должны быть поверх ВСЕХ остальных окон? Что то типа Царь горы? :)

← →
TUser © ( 2005-07-07 18:01 ) [2]

По таймеру делай Show.

← →
begin. end © ( 2005-07-07 18:05 ) [3]

WM_WINDOWPOSCHANGING отлавливать не поможет?

← →
Stalker01 © ( 2005-07-07 18:54 ) [4]


> TUser ©

Не помогает

> begin. end ©

А можно подробнее?

← →
TUser © ( 2005-07-07 18:59 ) [5]

> Не помогает

А мне помогает. Честное слово!

← →
DiamondShark © ( 2005-07-07 19:03 ) [6]


> Алхимик © (07.07.05 17:52) [1]

Что будет если всесокрушающий снаряд попадёт в абсолютно непробиваемую стену?
Типа того.

← →
begin. end © ( 2005-07-07 21:12 ) [7]

> Stalker01 © (07.07.05 18:54) [4]
> А можно подробнее?

Я не знаю, корректно так делать или нет, но попробовать можно.

type
TForm1 = class(TForm)
.
private
procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
.
end;

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging);
begin
inherited;
Message.WindowPos.hwndInsertAfter := HWND_TOPMOST
end.

← →
Stalker01 © ( 2005-07-08 14:30 ) [8]

2begin. end
Идею понял, но у мня при этом на некоторых приложениях комп зависал, поэтому я сделал SetWindowPos на таймер, конечно некрасиво, зато работает.
Проблема в том, что моя форма выводиться поверх всех окон, но если имеется окно с частой перерисовкой (например игра), то моя форма просто зарисовываеться, графикой этого окна, хоть и находиться сверху. Пробовал делать по таймеру Repaint формы, но при этом она очень сильно мерцает, можно ли решить данную проблему?

← →
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.

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);

Я так понимаю сервер будет активировать дочернею форму, которая перекроет экран.(Считаю такой подход не эффективным). Ну, хозяин барин.
Итак на форму 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;

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. Хотите реалтайм создавайте поток с данным приоритетом и создавайте в нем динамически форму. Только вот как вы ее закроете потом? Если даже мышь не получит управления. Посему лучше использовать поток с приоритетом пониже.
Помните, что для того чтобы успешно закрыть/открыть форму с приоритетом реалтайм нужно что бы и сервер (он принимает/выполняет команды клиента) также имел приоритет реалтайм, в противном случае он неполучает процессорное время.

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

все будет нормально, и никто твое приложение не свернет, только если специально обратившись к 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?

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

Если вам потребовалось закрепить какое-то окно поверх всех других окон в Windows, а в настройках программы, которой принадлежит это окно такого параметра нет, к сожалению, системных средств для этого действия также нет. Но вы можете поместить окно «всегда сверху» с помощью нескольких бесплатных утилит.

В этой статье несколько способов закрепить окно программы поверх всех окон Windows 10, 8.1 или Windows 7 с помощью бесплатных программ, которые позволят выполнять это сочетанием клавиш, с помощью меню в области уведомлений и другими методами.

Как сделать программу или окно всегда поверх всех окон с помощью AutoHotKey

AutoHotKey — популярная программа, позволяющая создать скрипты для собственных горячих клавиш в различных программах или в Windows в целом. С помощью неё можно создать и сочетание клавиш, которое будет включать режим «Всегда сверху» для активного окна:

Разумеется, вы можете задать свою комбинацию: в моем примере используется ^ (Ctrl), + (Shift) и SPACE (пробел).

DeskPins — простая бесплатная программа для закрепления окна поверх других окон

Программа DeskPins

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

PinWin

PinWin — еще одна бесплатная программа для помещения выбранных окон поверх остальных, даже когда они неактивны. После установки и запуска программы ее значок отобразится в области уведомлений Windows, и там можно будет выбрать окно, которое нужно закрепить поверх других окон из списка, либо указав на него (пункт «Select Window From Screen»).

Закрепление окно поверх других в PinWin

На самом деле, программ подобного рода множество, как правило они бесплатны и не занимают много места. Два похожих инструмента со слегка иной реализацией закрепления поверх всех окон — OnTopper и TurboTop.

Дополнительно, если вам требуется закрепить окно какой-то конкретной программы поверх других окон, не исключено, что такая настройка присутствует в параметрах самой этой программы: например, вы найдете такую настройку в диспетчере задач Windows, медиа плеере VLC, для видео в браузере Google Chrome можно использовать расширение Floating Video, для браузера Firefox есть дополнение «Always on Top», во многих других программах также можно отыскать соответствующие возможности.

Добрый день, коллеги!
Столкнулся с таким нюансом (с некоторой спецификой) и стандартные способы, описанные в различных источниках, для такого моего "особого" случая не подошли. А примеры с похожей ситуацией мне найти не удалось.
Ситуация такова. Из начальной формы своего приложения, вызываем новую форму (назовём её "окно с анимацией", чтоб дальше меньше путаться), которая должна находиться поверх этой (начальной) формы, вызвавшей её. Что бы, во-первых, если щёлкнуть указателем мыши в окно уровнем ниже оно не переносилось на верх, во-вторых что бы, если в процессе работы с этим приложением, в этот момент, открыли какое-либо другое окно, другой программы (например Word во весь экран), после чего захотели вернуться обратно к нашему приложению, но не Alt+Tab'ом, а просто выбрав его иконку на панели задач, чтоб опять же "окно с анимацией" отображалось поверх главной формы, а не так, что главная форма активировалась "наверх", а вызванное ею "окно анимации" где-то затерялось за остальными окнами. Надеюсь не сильно запутал вступлением.
Так вот, всё бы ни чего, если бы не следующий нюанс. Вызываемая форма ("окно с анимацией") в моём случае не на прямую в главном потоке класса начальной формы вызывается. Т.е. не так:

ибо в таком случае, я бы передал в метод .Show(), вызываемой формы, this, и всё было бы как раз так, как мне надо. Т.е. оговорю сразу, что вариант с использованием TopMost формы WaitingRead мне не подходит, т.к. мне нужно, чтоб это окно не поверх всех окон рабочей среды в целом отображалось, а только по верх окон одного моего приложения.
Так вот, форма эта в моём обработчике вызывается в отдельном потоке, используя BackgroundWorker.
Приведу основную выжимку кода для наглядности:

Так вот, если я достаточно понятно изложил суть проблемы, подскажите, как вызывая окно в таком случае, заставив его корректно отображаться поверх главного, пока не выполнится bw.CancelAsync(); или выход по ESC, когда его нажатие отловится.

Читайте также: