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

Обновлено: 12.05.2024

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

Нравится ресурс?

ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi

Пожалуйста, выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля. Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
. (продолжение следует) .
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца.

Модераторы: jack128, D[u]fa, Shaggy, Rouse_

'> Вторая форма - поверх всех окон относительно других приложений

Senior Member

Рейтинг (т): 2

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

Senior Member

Рейтинг (т): 144

SetWindowPos(Form2.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);

Рейтинг (т): 199

Или установить свойство FormStyle в fsStayOnTop.

Senior Member

Рейтинг (т): 2

Или установить свойство FormStyle в fsStayOnTop.

сам пробывал? )
не помогает - не писал бы

Добавлено 27.07.12, 08:24
Filka

SetWindowPos(Form2.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);


не помогает)))
сам попробуй))))

Senior Member

Рейтинг (т): 144

Emmys, код в студию.

Senior Member

Рейтинг (т): 2

unit Unit1;

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

Form1: TForm1;

implementation

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);

SetWindowPos(Form2.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);

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

Подскажите. У меня простая прога. Одна форма. Хочу сделать её поверх всех окон. Подскажите также вариант, как это делать программно.

Дополнительный вопрос. Где мне выставить значения, чтобы размеры окна были фиксированными?

На спасибо не скуплюсь.
С уважением, Владислав.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

94731 / 64177 / 26122 Ответы с готовыми решениями:


Как запустить приложение поверх всех окон
Подскажите, как реализовать в проекте, чтобы exe-ка запускалась поверх всех что есть окон?

Как из Дельфи запустить другое приложение поверх всех окон?
Для чеого: Хожу по домам чиню компы. Достали поронобаннеры. Хочу написать прогу, которая будет.

Поверх всех окон
Подскажите как сделать чтобы форма была поверх всех окон .

Приложение поверх всех окон
Привет всем, не подскажите как сделать чтоб приложение было поверх всех окон (т.е никакие программы.

Форма поверх всех окон

Помощь в написании контрольных, курсовых и дипломных работ здесь.

94731 / 64177 / 26122 Ответы с готовыми решениями:

Форма поверх всех окон
никак не допишу родительский контроль подскажите, как сделать форму поверх всех окон (прям всех).

Форма поверх всех окон
Почему если у формы стоит в параметрах FormStyle fsstayontop, то при запуске какой нибудь игры.

Вторая форма поверх всех окон
Здравствуйте. Есть две формы Form1 и Form2. Нужно сделать чтобы при нажатии на кнопку вторая форма.


Форма поверх всех окон Windows
Доброго времени суток! Пытаюсь сделать так, чтобы форма delphi выводилась поверх остальных окон.

Установка формы поверх всех без перехвата фокуса

тогда форма будет поверх всех окон и фокус не будет перехватываться. Я добавил этот вызов в обработчик события FormLoad, но форма всеравно перехватывает фокус. Что я делаю не так?

Уже как только не пробовал вызывать эту функцию. так намучился. Сперва три часа мучился искал причину, почему форма перехватывает фокус, когда я делал вот так:

Потом нагуглил, что эта штука не работает, если TopMost == True. Теперь вот с этой апишной функцией играюсь и ничего не получается.

Никогда не думал, что будет такой большой проблемой вывести форму поверх всех окон без активации.

94731 / 64177 / 26122 Ответы с готовыми решениями:


Окно поверх всех без фокуса!
Задача такова, что нужно создать окно которое будет по верх всех окон(приложений) находящихся на.

Окно без фокуса, поверх других окон
Подскажите, как сделать что бы окно, будучи даже без фокуса, находилось поверх других окон.

Форма поверх всех окон (даже после потери фокуса).
К примеру есть две формы: form1 и form2. form2 запускается из form1, и должна всегда оставаться.


Две формы поверх всех окон. Вторая не хочет быть поверх
Ребят, поиск юзал, всё пробовал. Вторая форма не хочет быть наверху, первая нормально наверху.

605 / 580 / 157 эм. ты наверное ошибаешся. специально создал тестовый проект, на форме текстбокс, кнопка и лабел:

при нажатии на текстбок - пишется true, при клике в ту же студию - форма остаётся на переднем плане, а текст - false

Добавлено через 1 минуту
никаких winAPI, просто topMost=true;

210 / 132 / 8 при клике в ту же студию - форма остаётся на переднем плане, а текст - false

Вы меня неправильно поняли. Понятное дело, что когда вручную активировать другое приложение, то наша форма потеряет фокус. А вы попробуйте сделать так, чтобы когда наша форма появляется, она не перехватывала фокус!

Вот я создал проект с формой с установленным TopMost=True и переписанным свойством ShowWithoutActivation

Далее делаем в файле Program.cs вот так:

Компилируем и запускаем программу и быстро открываем блокнот и печатаем в нем текст. Когда через 3 секунды откроется форма, то она перехватит на себя фокус и текст станет печататься не в блокноте, а на форме! что жутко мне не нужно (я пытаюсь сделать всплывающее окно со своими кнопками)

Вот вторая форма для теста с WinAPI функцией:

Форма устанавливается поверх всех окон, но фокус также перехватывается. И я не могу понять почему! Наверное я не там, где надо вызываю эту функцию. Помогите разобраться! Я уже столько намучился с этим тошнотным перехватом фокуса.

Ниже этот проект с двумя формами. Попробуйте его у себя запустить.

605 / 580 / 157 вторая форма:

обрати внимание что у тебя стоит
Form1 form2=new Form1();
что не есть хорошо

210 / 132 / 8 обрати внимание что у тебя стоит
Form1 form2=new Form1();

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

Добавлено через 2 минуты

Я проект создал просто для теста, чтобы сосредоточить внимание на безфокусной поверхоконности лишь только. Потому даный момент меня не волнует нисколько. Всплывашка, в которой я пытаюсь это проделать, будет располагаться вовсе в другом моем проекте, где такой проблемы нет. 605 / 580 / 157 210 / 132 / 8 Возникла вторая проблема. Форма не хочет быть поверх окон, если она создается в обработчике таймера System.Timers.Timer и я не знаю, чем это вызвано. Если вместо этого таймера использовать System.Windows.Forms.Timer, тогда форма ведет себя так, как от нее ожидается. Но в моей задаче нужно использовать первый таймер System.Timers.Timer. Почему в нем форма ведет себя непредсказуемо и не отображается поверх всех окон?
605 / 580 / 157

честно, не знаю почему вызывается настолько странная ошибка, но ты уверен что каждые 5 секунд хочешь создавать по новой форме?

Добавлено через 56 секунд
а хотя возможно из-за ShowDialog процесс не возвращается к таймерам и ждёт пока закроют приложения, да..

210 / 132 / 8 но ты уверен что каждые 5 секунд хочешь создавать по новой форме? Это просто для тестов я задал такой интервал, чтобы хорошо было видно, что при каждом создании формы она почему-то не поверх всех окон.. В реальном приложении этот интервал будет произвольным в зависимости от предпочтений пользователя 605 / 580 / 157

в любом случае, попробуй:

с этими магическими ошибками всякое может помочь) 210 / 132 / 8 а хотя возможно из-за ShowDialog процесс не возвращается к таймерам

Я забыл уточнить, что поместил на саму форму тоже один таймер, который автоматически закрывает форму через одну секунду, так что не в этом проблема.

Добавлено через 1 минуту

в любом случае, попробуй а где здесь в вашем коде вообще вызов формы? Тут не то что компилятор, здесь и невооруженным глазом видно, что теперь форма вообще не будет появляться. 605 / 580 / 157 а, да, прошу прощения, чегото заработался немножко, косяки пошли) хотел в обработчике таймера:
правда в этом случае при закрытии формы и программа закроется) 210 / 132 / 8

В этом случае та же самая проблема - форма не поверх окон.

Добавлено через 7 минут
Я так полагаю, что проблема в том, что таймер System.Timers.Timer работает в другом потоке (в отличие от таймера System.Windows.Forms.Timer). Потому нужно как-то заставить создаться форме и показать ее не в потоке таймера, а в главном потоке. Может тогда проблема решится. Но как это сделать?

Еще, на msdn читал, что если этот таймер используется на UI-элементе, тогда его свойству SynchronizingObject нужно присвоить ссылку на сам UI-элемент, который содержит таймер. То есть, что-то типа:

Но в моем случае загвозда в том, что не таймер должен быть привязан к форме, а форма к таймеру, так как таймер генерирует события, создающие формы одну за другой. И я чисто физически не могу присвоить свойству SynchronizingObject ссылку на форму, так как тогда в тот отрезок времени форма еще не создана.

605 / 580 / 157 хм. ну, раз 1 таймер не работает как нужно а второй не подходит по каким-то причинам, предлагаю создать поток:

по идее тоже самое, только параметров меньше)

Добавлено через 1 минуту
а-а, опять забылся, в вечном цикле добавь сон:

Добавлено через 46 секунд
а по поводу таймеров - они по идее оба в отдельных потоках работают. 210 / 132 / 8 ладно. это оставим на потом.. Спасибо. (ваш пример с потоками пока не тестировал)
Просто, сказать по правде, мне уже чисто спортивно интересно, чем вызвано то, что при втором таймере форма ведет себя мистически непредсказуемо. Я не успокоюсь, пока не найду ответ на этот вопрос. 4075 / 3809 / 745 Записей в блоге: 11 Форма не хочет быть поверх окон, если она создается в обработчике таймера System.Timers.Timer и я не знаю, чем это вызвано. Если вместо этого таймера использовать System.Windows.Forms.Timer, тогда форма ведет себя так, как от нее ожидается. Но в моей задаче нужно использовать первый таймер System.Timers.Timer. Почему в нем форма ведет себя непредсказуемо и не отображается поверх всех окон? 210 / 132 / 8

Были у меня догадки по этому поводу, а вы их утвердили..) Получается, надо использовать Windows.Forms.Timer и от него никуда не убежишь.
Я вчера пробовал dotPeek-ом просмотреть реализацию этих двух таймеров, чтобы понять их различие в середине, но там оказалось не все так просто, как я думал. разбираться придется очень долго..))

А такой вопрос: как на счет производительности этих таймеров? Есть различия или нет? по этому вопросу что-то ничего не нагуглил, может плохо искал. Просто вот в чем суть, почему я сначала так упорно не хотел использовать Windows.Forms.Timer. Программа фоновая и в ней постоянно работает таймер, который генерирует через определенные промежутки некоторые действия(которые с UI вообще никак не связаны и пользователю вообще ничего не выводится). Но если пользователь поменяет в настройках одну вещь(это 1% из 100. ), тогда при каждой генерации события этого таймера должна выводиться всплывашка возле трея (типа напоминание - то есть эта неактивированная форма поверх всех окон). То есть, в большинстве случаев таймер вообще не имеет ничего общего с интерфейсом. А на мсдн говорится, что Windows.Forms.Timer должен использоваться на форме. А в моей программе это условие выполняется лишь может один раз из 100.

То ничего нет плохого в производительности, что я буду использовать таймер для форм в такой ситуации?

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

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

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

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

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

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

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

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

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

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


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


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

Почему под Windows 10 форма не выводится поверх всех окон?

Есть программа на Delphi XE8, висящая в области уведомлений и при определённых событиях показывающая окно с информацией. Под Windows 7 следующий код обеспечивал показ формы поверх всех окон практически на 100%.

И этот код перестал срабатывать под Windows 10. Точнее, иногда окно появляется поверх всех, но гораздо чаще оказывается наоборот в самом "низу", под всеми окнами. Может кто сталкивался с таким? И как это попробовать полечить?

Открытие управляемой формы 1С поверх окон

Любой начинающий разработчик управляемого приложения 1С, который дошел до открытия управляемых форм заметил, что новая форма открывается всегда не поверх текущего окна, а в соседнем окне. Этот режим открытия называют Независимым. Но очень часто для удобства работы пользователей форму нужно открыть именно поверх всех имеющихся окон. Разберемся, как это работает.

Прежде чем изучать открытие формы программно, познакомимся с очень интересным свойством управляемой формы 1С, которое называется РежимОткрытияОкна. Именно это свойство отвечает, каким образом откроется новое окно. Это свойство принимает три значения: Независимый, Блокировать окно владельца и Блокировать весь интерфейс.

Свойство формы 1С режим открытия окна

Если у формы 1С установлен Независимый режим открытия окна, то форма откроется в отдельном окне, как на рисунке ниже.

Независимый режим открытия окна

Здесь и далее приведена конфигурация из книги «Основы разработки в 1С: Такси».

В том случае если установлен режим Блокировать окно владельца или Блокировать весь интерфейс, то форма откроется по верх всех окон.

Форма 1С открыта по верх всех окон

Только в случае режима Блокировать окно владельца, будет заблокирована форма, в которой было инициализировано открытие новой формы. А в случае режима Блокировать весь интерфейс заблокируется весь интерфейс программы 1С. По сути, форма откроется в модальном режиме.

Со свойством формы разобрались, перейдем к открытию формы при помощи программного кода. Делать мы это будем при помощи уже знакомого нам метода ОткрытьФорму. Как работает этот метод, читайте в моей статье:

У этого метода есть последний седьмой параметр, который называется РежимОткрытияОкна, этот параметр имеет тип системное перечисление РежимОткрытияОкнаФормы, которое содержит в себе уже знакомые нам режимы: Независимый, Блокировать окно владельца и Блокировать весь интерфейс.

Если мы в методе ОткрытьФорму установим в седьмой параметр какое-либо значение, то форма откроется согласно этому значению.

Ниже приведены все три варианта открытия окна формы с использованием параметра РежимОткрытияОкна:

Изучайте управляемые формы 1С с моими статьями:

Открытие управляемой формы существующего объекта

Открытие управляемой формы 1С на основании другого объекта

Открытие обычной формы в управляемом приложении 1С

Очень подробно вопросы по работе с управляемыми формами в частности и с управляемым приложением в целом рассмотрены в книге «Основы разработки в 1С: Такси. Разработка управляемого приложения за 12 шагов». Эта книга станет настоящим подспорьем для тех, кто только начал знакомится с разработкой управляемого приложения.


  1. Без сложных технических терминов;
  2. Более 600 страниц практического материала;
  3. Каждый пример сопровождается рисунком (скриншот);
  4. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!

Промо-код на скидку в 16%: vCph8bW3rE


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

можно оплатить вручную:

Как вывести окно поверх всех окон в Windows?

Нужно вывести окно поверх всех окон, для эффекта водяного знака. Возможно ли это сделать с помощью WPF без использования WinApi?


12.1k 12 12 золотых знаков 37 37 серебряных знаков 66 66 бронзовых знаков задан 16 апр '19 в 6:20


Максим Поздеев Максим Поздеев 55 5 5 бронзовых знаков

У окна WPF есть специальное свойство Topmost . Его нужно установить в true :

UPD. Не сразу понял, чего хотел добиться автор. Для того, чтобы сделать некоторое подобие "водяного знака" лучше использовать Image , а не окно.

Пусть наш водяной знак будет котиком. Думаю, все любят котиков :)

1.jpg

Изображение, с которым мы будем работать: 1.jpg

А возможно ли сделать окно некликабельным? Чтобы можно было взаимодействовать с объектами за ним

Это возможно для любого UIElement . Для этого нам понадобится свойство IsHitTestVisible установить в false . Ну и чтобы сделать изображение полупрозрачным, используем свойство Opacity="0.2" .

Таким образом, xaml-код будет выглядеть так:

Теперь мы можем кликать на кнопку, и котик нам не будет мешать это делать)

введите сюда описание изображения

Результат работы программы:

Форма поверх всех окон в системе (через WinAPI), фокусировка

мне нужно сделать прогу, которая будет всегда висеть поверх всех окон windows, даже диспетчер задач не должен перекрывать форму и игры там всякие на подобии тех программ, которые позволяют делать любые окна в системе поверх остальных. Как они это делают. Я пробовал SetWindowPos, но я так понял, что нужно чтобы этот метод вызывался постоянно и ещё SetFocus тоже. Или может есть другой адекватный способ?

задан 6 авг '18 в 14:49


Наталья Новиченко Наталья Новиченко

19 2 2 бронзовых знака

сделать прогу, которая будет всегда висеть поверх всех окон windows это нельзя сделать, как минимум потому, что если 2 такие проги запустить, одна всегда будет перекрывать другую

Как держать окно всегда поверх других окон? (WinAPI, C++)

Приложение выводит видеоролик на весь экран, который должен быть всегда поверх всех окон, чтобы его нельзя было свернуть или закрыть другими окнами, пока не выполнятся определённые условия. Для этого каждая итерация в цикле вывода кадров начинается с SetWindowPos(VideoWindow, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE); , но, к сожалению это не спасает - по alt+tab видео можно проигнорировать. Есть такие окна, с которых невозможно перевести фокус на другие приложения - как это сделать с окном данного видеоролика?

2xTOPMOST

Ответ, который я дал сам, работает через раз. В связи с комментариями по поводу двух TOPMOST окон добавляю следующий скриншот: Два TOPMOST окна, предположительно со стилями WS_EX_TOPMOST, будут перекрывать друг друга тем, которое из них активно. Такое поведение допустимо.

Вопрос открыт!

КАК сделать всегда в топе Z-порядка видеоролик в cvNamedWindow, так же, как это делает портативный AIMP (который не имеет админских привелегий и не является частью ОС, как тот же диспетчер задач?

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