Visual studio поверх всех окон
Я создаю небольшое приложение, которое выполняет обновления программных файлов другого программного обеспечения, а затем запускает это программное обеспечение. После запуска приложения во втором потоке графического интерфейса отображается всплывающее окно, а в основном потоке создается и отображается главное окно второго приложения:
После отображения оболочки второго приложения первое окно закрывается. Все работает нормально, за исключением того, что оболочка второго окна появляется под * другими окнами. То есть: я запускаю приложение запуска из проводника, окно запуска отображается поверх окна проводника. Окно запуска закроется, и под окном проводника появится главное окно приложения:
Который решает эту проблему, но тогда я не могу отображать другие окна над оболочкой, даже если я нажимаю на другое приложение на панели задач.
Ничего не делает . Как правильно этого добиться?
3 ответа
Благодаря ответам Майка и Шеридана я нашел решение просто активировать окно в потоке, в котором оно создано. Итак
Делает свое дело.
Если я правильно помню, я решил эту проблему в WPF Smart Client с помощью внешнего модуля запуска, выполнив следующие действия:
После запуска основного приложения программа запуска вызывает AllowSetForegroundWindow через P / Invoke, чтобы позволить главному приложению установить окно переднего плана (это разрешено, если программа запуска активна).
Главное приложение вызывает SetForegroundWindow через P / Invoke, чтобы установить окно переднего плана в его главное окно оболочки.
. Или что-то вдоль этих линий. Это мог быть модуль запуска, который вызвал SetForegroundWindow после того, как дождался, пока главное окно приложения станет активным. Это было некоторое время назад, и у меня больше нет доступа к источнику.
Во втором примере нет смысла, поскольку пользовательский интерфейс не обновляется во время выполнения программы, и поэтому ваш вызов shell.Topmost = true; будет проигнорирован. Лучшим способом добиться желаемого может быть обработка Window.Deactivated и, возможно, Window.Activated событий:
Не раз натыкаюсь на такое в процессе работы: видно куда-то там тыкаю, а куда именно тыкаю проходит мимо внимания.
Но окно студии начинает показываться поверх всех остальных окон. Запускаю проект в студии - проект показывается сзади окна студии. Активирую любое другое окно (проводник, диспетчер задач): если студия активна - это окно показывается сзади окна студии. Чтобы увидеть другие окна, приходится сворачивать окно студии.
Одно из найденных лекарств - удалить настроечные файлы проекта (.suo , .sln.DotSettings . ), но это сбрасывает все мои настройки.
Где можно в студии настроить приоритет отображения окна?
PrintDialog поверх остальных окон
Здравствйте! Есть программа, она ждет пока в определенной папке появится файл и когда он там.
форма поверх остальных окон
при коде, на создании формы 1 этот код работает Form1.FormStyle:=fsStayOnTop; но если на.
Приложение JFrame поверх остальных окон
Можно ли сделать, чтобы приложение было всегда поверх остальных окон в виндоуз? Можно ли его.
Форма не становится поверх остальных окон
Скажите пожалуйста, в чем ошибка private void поверхОкон_CheckedChanged(object sender, EventArgs.
jetyb, попробуй временно отключить resharper. Он может быть источником проблемы. Если она исчезнет, то попробуй обновить ReSharper если он у тебя не последней версии.
Как? Окно программы - поверх остальных окон.
Как сделать, чтобы окно программы всегда было поверх остальных окон? Спасибо всем, кто ответит!
Отображение MessageBox поверх остальных окон в Windows
Здравствуйте. Никак не получается добиться у MessageBox такого же поведения в плане отображения.
Показать окно поверх всех остальных окон
Здравствуйте! помогите пожалуйста по такому вопросу, нужно сделать так чтоб окно моего приложения.
Выскакивают банеры поверх остальных окон в браузере
Устанавливал вай вай роутер на компьютер, в следствии чего, каким-то образом подхватит вирус.
Мне нужно, чтобы форма появлялась поверх всех окон, при этом чтобы не перехватывала фокус (типа всплывашки). Но проблема в глючном шарпу в том, что если установить свойство формы TopMost в True, тогда форма перехватывает фокус, даже если переоверрайдить свойство ShowWithoutActivation в True. Приходится прибегать к API-шной функции SetWindowPos:
тогда форма будет поверх всех окон и фокус не будет перехватываться. Я добавил этот вызов в обработчик события FormLoad, но форма всеравно перехватывает фокус. Что я делаю не так?
Уже как только не пробовал вызывать эту функцию. так намучился. Сперва три часа мучился искал причину, почему форма перехватывает фокус, когда я делал вот так:
Потом нагуглил, что эта штука не работает, если TopMost == True. Теперь вот с этой апишной функцией играюсь и ничего не получается.
Никогда не думал, что будет такой большой проблемой вывести форму поверх всех окон без активации.
Окно поверх всех без фокуса!
Задача такова, что нужно создать окно которое будет по верх всех окон(приложений) находящихся на.
Окно без фокуса, поверх других окон
Подскажите, как сделать что бы окно, будучи даже без фокуса, находилось поверх других окон.
Форма поверх всех окон (даже после потери фокуса).
К примеру есть две формы: form1 и form2. form2 запускается из form1, и должна всегда оставаться.
Две формы поверх всех окон. Вторая не хочет быть поверх
Ребят, поиск юзал, всё пробовал. Вторая форма не хочет быть наверху, первая нормально наверху.
при нажатии на текстбок - пишется true, при клике в ту же студию - форма остаётся на переднем плане, а текст - false
Добавлено через 1 минуту
никаких winAPI, просто topMost=true;
Вы меня неправильно поняли. Понятное дело, что когда вручную активировать другое приложение, то наша форма потеряет фокус. А вы попробуйте сделать так, чтобы когда наша форма появляется, она не перехватывала фокус!
Вот я создал проект с формой с установленным TopMost=True и переписанным свойством ShowWithoutActivation
Компилируем и запускаем программу и быстро открываем блокнот и печатаем в нем текст. Когда через 3 секунды откроется форма, то она перехватит на себя фокус и текст станет печататься не в блокноте, а на форме! что жутко мне не нужно (я пытаюсь сделать всплывающее окно со своими кнопками)
Вот вторая форма для теста с WinAPI функцией:
Форма устанавливается поверх всех окон, но фокус также перехватывается. И я не могу понять почему! Наверное я не там, где надо вызываю эту функцию. Помогите разобраться! Я уже столько намучился с этим тошнотным перехватом фокуса.
Ниже этот проект с двумя формами. Попробуйте его у себя запустить.
обрати внимание что у тебя стоит
Form1 form2=new Form1();
что не есть хорошо
блинннн. стопятсотый раз удостоверяюсь, что ошибки и глюки кроются там, где ты их вообще не ждешь и не там где ищешь, и часто их проблемой бывает тупая явная невнимательность, как в этом случае Спасибо.
Добавлено через 2 минуты
Я проект создал просто для теста, чтобы сосредоточить внимание на безфокусной поверхоконности лишь только. Потому даный момент меня не волнует нисколько. Всплывашка, в которой я пытаюсь это проделать, будет располагаться вовсе в другом моем проекте, где такой проблемы нет.
Возникла вторая проблема. Форма не хочет быть поверх окон, если она создается в обработчике таймера System.Timers.Timer и я не знаю, чем это вызвано. Если вместо этого таймера использовать System.Windows.Forms.Timer, тогда форма ведет себя так, как от нее ожидается. Но в моей задаче нужно использовать первый таймер System.Timers.Timer. Почему в нем форма ведет себя непредсказуемо и не отображается поверх всех окон?
честно, не знаю почему вызывается настолько странная ошибка, но ты уверен что каждые 5 секунд хочешь создавать по новой форме?
Добавлено через 56 секунд
а хотя возможно из-за ShowDialog процесс не возвращается к таймерам и ждёт пока закроют приложения, да..
Это просто для тестов я задал такой интервал, чтобы хорошо было видно, что при каждом создании формы она почему-то не поверх всех окон.. В реальном приложении этот интервал будет произвольным в зависимости от предпочтений пользователя
в любом случае, попробуй:
Я забыл уточнить, что поместил на саму форму тоже один таймер, который автоматически закрывает форму через одну секунду, так что не в этом проблема.
Добавлено через 1 минуту
а где здесь в вашем коде вообще вызов формы? Тут не то что компилятор, здесь и невооруженным глазом видно, что теперь форма вообще не будет появляться.
В этом случае та же самая проблема - форма не поверх окон.
Добавлено через 7 минут
Я так полагаю, что проблема в том, что таймер System.Timers.Timer работает в другом потоке (в отличие от таймера System.Windows.Forms.Timer). Потому нужно как-то заставить создаться форме и показать ее не в потоке таймера, а в главном потоке. Может тогда проблема решится. Но как это сделать?
Еще, на msdn читал, что если этот таймер используется на UI-элементе, тогда его свойству SynchronizingObject нужно присвоить ссылку на сам UI-элемент, который содержит таймер. То есть, что-то типа:
Но в моем случае загвозда в том, что не таймер должен быть привязан к форме, а форма к таймеру, так как таймер генерирует события, создающие формы одну за другой. И я чисто физически не могу присвоить свойству SynchronizingObject ссылку на форму, так как тогда в тот отрезок времени форма еще не создана.
хм. ну, раз 1 таймер не работает как нужно а второй не подходит по каким-то причинам, предлагаю создать поток:
по идее тоже самое, только параметров меньше)
Добавлено через 1 минуту
а-а, опять забылся, в вечном цикле добавь сон:
ладно. это оставим на потом.. Спасибо. (ваш пример с потоками пока не тестировал)
Просто, сказать по правде, мне уже чисто спортивно интересно, чем вызвано то, что при втором таймере форма ведет себя мистически непредсказуемо. Я не успокоюсь, пока не найду ответ на этот вопрос.
Форма не хочет быть поверх окон, если она создается в обработчике таймера System.Timers.Timer и я не знаю, чем это вызвано. Если вместо этого таймера использовать System.Windows.Forms.Timer, тогда форма ведет себя так, как от нее ожидается. Но в моей задаче нужно использовать первый таймер System.Timers.Timer. Почему в нем форма ведет себя непредсказуемо и не отображается поверх всех окон?
Были у меня догадки по этому поводу, а вы их утвердили..) Получается, надо использовать Windows.Forms.Timer и от него никуда не убежишь.
Я вчера пробовал dotPeek-ом просмотреть реализацию этих двух таймеров, чтобы понять их различие в середине, но там оказалось не все так просто, как я думал. разбираться придется очень долго..))
А такой вопрос: как на счет производительности этих таймеров? Есть различия или нет? по этому вопросу что-то ничего не нагуглил, может плохо искал. Просто вот в чем суть, почему я сначала так упорно не хотел использовать Windows.Forms.Timer. Программа фоновая и в ней постоянно работает таймер, который генерирует через определенные промежутки некоторые действия(которые с UI вообще никак не связаны и пользователю вообще ничего не выводится). Но если пользователь поменяет в настройках одну вещь(это 1% из 100. ), тогда при каждой генерации события этого таймера должна выводиться всплывашка возле трея (типа напоминание - то есть эта неактивированная форма поверх всех окон). То есть, в большинстве случаев таймер вообще не имеет ничего общего с интерфейсом. А на мсдн говорится, что Windows.Forms.Timer должен использоваться на форме. А в моей программе это условие выполняется лишь может один раз из 100.
То ничего нет плохого в производительности, что я буду использовать таймер для форм в такой ситуации?
В Visual Studio можно настроить расположение, размер и поведение окон, что позволит создать макеты окон, оптимально подходящие для различных рабочих процессов разработки. После того как макет будет настроен, интегрированная среда разработки запомнит его. Например, если после изменения места прикрепления окна обозревателя решений закрыть Visual Studio, во время следующего открытия Visual Studio окно обозревателя решений будет закреплено в том же месте, даже если работа будет продолжена на другом компьютере.
Можно также присвоить настраиваемому макету имя, сохранить его, а затем переключаться между макетами с помощью одной команды. Например, можно создать один макет для редактирования, а другой — для отладки и переключаться между ними с помощью команды меню Окно > Применить макет окна.
Окна инструментов и документов
В среде IDE существует два основных типа окон: окна инструментов и окна документов. В число окон инструментов входят обозреватель решений, обозреватель сервера, окно вывода, список ошибок, конструкторы, окна отладчика и т. д. Окна документов содержат файлы исходного кода, произвольные текстовые файлы, файлы конфигурации и т. д. Изменять размер и перетаскивать окна инструментов можно с помощью их строки заголовка. Перетаскивание окон документов осуществляется с помощью вкладки. Правой кнопкой мыши щелкните вкладку или строку заголовка, чтобы задать другие параметры для окна.
В меню Окно находятся параметры закрепления, перемещения и скрытия окон в интегрированной среде разработки. Щелкните правой кнопкой мыши вкладку или строку заголовка окна, чтобы просмотреть дополнительные параметры для этого конкретного окна. Одновременно можно отображать несколько экземпляров окон инструментов. Например, можно открыть несколько окон веб-браузера. Кроме того, можно создать дополнительные экземпляры некоторых окон инструментов, выбрав команду Создать окно в меню Окно .
Разделение окон
Если в документе необходимо одновременно просмотреть или изменить два различных места, можно разделить окна. Чтобы разделить документ на две части с независимой прокруткой, выберите Разделить в меню Окно . Чтобы восстановить единое представление, выберите Снять разделение в меню Окно .
Вкладки
С помощью вкладок вы можете размещать макеты различными способами. Например, можно предварительно просматривать файл в редакторе, не открывая файл, группировать вкладки и выполнять многие другие задачи.
Вкладка предварительного просмотра (окна документов)
На вкладке Предварительный просмотр можно просматривать файлы в редакторе, не открывая их. Просмотреть файлы можно путем их выбора в обозревателе решений, во время отладки при заходе в файлы, с помощью команды Перейти к определению, а также при просмотре результатов поиска. Файлы для предварительного просмотра отображаются на вкладке в правой части вкладки документа. Файл становится доступным для редактирования при его изменении или выборе команды Открыть.
Вертикальные вкладки документов
Новые возможности Visual Studio 2019 версии 16.4 и более поздних : мы добавили одну из наиболее часто запрашиваемых функций — вертикальные вкладки документов. Теперь вы можете управлять вкладками документов в вертикальном списке в левой или правой части редактора.
Вертикальные вкладки документов можно применить следующими способами:
Последовательно выберите элементы Средства > Параметры > Среда > Вкладки и окна в строке меню. Затем в раскрывающемся списке Задать макет вкладки выберите элемент Сверху, Слева или Справа.
Щелкните вкладку правой кнопкой мыши, выберите команду Задать макет вкладки и щелкните элемент Слева или Справа (чтобы вернуть вкладки в расположение по умолчанию, выберите элемент Сверху).
Цветные вкладки документов
В Visual Studio 2022 доступны новые параметры персонализации, которые можно использовать для повышения эффективности кода. Мы добавили запрос на еще одну популярную функцию: вкладки документов цвета. Теперь вы можете выделить цветом вкладки файлов по проектам, чтобы упростить поиск открытых файлов.
Чтобы использовать цветные вкладки, перейдите в меню Сервис > Параметры > Среда > Вкладки и окна и выберите параметр Выделить цветом вкладки документов по проекту.
Далее приведены актуальные обновления:
Новые возможности Visual Studio 2022 версии 17.0 и более поздних версий : теперь можно выделить цветом вкладки как в вертикальном, так и в горизонтальном представлении редактора.
На следующем снимке экрана показан пример цветных вкладок в вертикальном представлении:
На следующем снимке экрана показан пример цветных вкладок в горизонтальном представлении:
Новые возможности Visual Studio 2022 версии 17.1 и более поздних версий : вы также можете выбрать собственные цвета для вкладок. Для этого щелкните вкладку правой кнопкой мыши и выберите пункт Настроить цвет вкладки, чтобы выбрать цвет на палитре.
На следующем снимке экрана показан пример персонализации цветовой схемы для вкладок:
Группы вкладок
Группы вкладок расширяют возможности управления ограниченной рабочей областью при работе с двумя или более открытыми документами в интегрированной среде разработки. Несколько окон документов и окон инструментов можно упорядочить в вертикальные или горизонтальные группы вкладок и затем без труда переносить документы из одной группы в другую.
Панели инструментов
Вы можете разместить панели инструментов требуемым образом, перетащив их в нужное расположение, или используя диалоговое окно Настройка. Дополнительные сведения о размещении и настройке панелей инструментов см. в статье Практическое руководство. Настройка меню и панелей инструментов.
Размещение и закрепление окон
Окно документов или окно инструментов можно закрепить, чтобы задать для них расположение и размер в рамках окна среды IDE. Либо вы можете сделать эти окна плавающими, то есть независимыми от IDE.
Окно инструментов можно закрепить в любом расположении в пределах фрейма IDE. Вы можете закрепить некоторые окна инструментов в виде окон с вкладками в фрейме редактора. Также вы можете закрепить окна документов в пределах фрейма редактора либо в текущем расположении в последовательности перехода.
Кроме того, можно закрепить несколько окон для совместного перемещения в среде IDE или за ее пределами. Окна инструментов можно скрывать или сворачивать.
Существуют следующие способы размещения окон.
Закрепление окон документов в левой части вкладки.
Прикрепление окон в виде вкладок к области редактирования.
Закрепление окон инструментов по краю области интегрированной среды разработки.
Перемещение окно документов или окно инструментов по интегрированной среде разработки или за ее пределами.
Скрытие окон инструментов вдоль края интегрированной среды разработки.
Отображение окон на разных мониторах.
Сброс расположения окон до макета по умолчанию или до сохраненного настраиваемого макета.
Чтобы расположить окна инструментов и документов, поместите указатель в строку заголовка окна и перетащите его в нужное расположение. Также можно щелкнуть заголовок окна правой кнопкой мыши, чтобы использовать его контекстное меню, либо применить команды в меню Окно.
Закрепление окон
При щелчке и перетаскивании строки заголовка окна инструмента или вкладки окна документа появляется маркер в виде ромба. Во время операции перетаскивания, когда указатель мыши наведен на одну из стрелок в ромбе, будет отображена затененная область, показывающая место закрепления окна после отпускания кнопки мыши.
Чтобы переместить закрепляемое окно без прикрепления к месту, во время перетаскивания окна нажмите клавишу CTRL.
Чтобы вернуть окно инструмента или окно документа в последнее место закрепления, нажмите клавишу CTRL во время выполнения двойного щелчка по заголовку или вкладке окна.
На следующем рисунке показан маркер в виде ромба для окон документов, которые могут быть закреплены только в рамках области редактирования.
Окна инструментов можно прикрепить к одной стороне рамки в интегрированной среде разработки или в пределах области редактирования. Маркер в виде ромба появляется при перетаскивании окна инструмента в другое место и упрощает процесс закрепления.
На следующем рисунке показан обозреватель решений, закрепленный в новом месте, выделенном синим цветом:
Закрытие и автоматическое скрытие окон инструментов
Чтобы закрыть окно инструментов, нажмите кнопку X в верхнем правом углу заголовка окна. Для повторного открытия окна используйте соответствующее сочетание клавиш или команду меню. Окна инструментов поддерживают возможность автоматического скрытия, позволяющую выводить окно из поля зрения при использовании другого окна. Если окно автоматически скрыто, его имя отображается на вкладке на краю интегрированной среды разработки. Для повторного использования окна наведите указатель на вкладку, в результате чего окно возвращается обратно в представление.
Окна инструментов, для которых включена функция автоматического скрытия, могут временно становиться видимыми, когда они находятся в фокусе. Чтобы снова скрыть окно, выберите элемент за пределами текущего окна. При потере фокуса окно скрывается.
Использование второго монитора
Если имеется второй монитор, который поддерживается операционной системой, можно выбрать, в каком мониторе будет отображаться окно. Можно даже сгруппировать несколько окон в блоки на других мониторах.
Можно создать несколько экземпляров обозревателе решений и переместить их на другой монитор. Щелкните окно правой кнопкой мыши и выберите команду Создать представление обозревателя решений. Все окна можно вернуть на исходный монитор, щелкнув их дважды, удерживая нажатой клавишу CTRL.
Сброс, задание имен и переключение между макетами окон
Для возвращения исходного макета окон интегрированной среды разработки используется команда Сбросить макет окон . При запуске этой команды выполняются следующие действия.
Все окна перемещаются в расположения по умолчанию.
Окна, которые закрыты в макете по умолчанию, закрываются.
Окна, которые открыты в макете по умолчанию, открываются.
Создание и сохранение пользовательских макетов
Visual Studio позволяет сохранять до 10 пользовательских макетов окон и быстро переключаться между ними. В приведенных ниже инструкциях показано, как создавать, сохранять, вызывать пользовательские макеты, использующие несколько мониторов как с закрепленными окнами средств, так и с перемещаемыми, а также управлять ими.
Сначала создайте тестовое решение с двумя проектами, каждый с отдельным оптимальным макетом.
Создание проекта пользовательского интерфейса и настройка макета
Если у вас несколько мониторов, переместите окна Обозреватель решений и Свойства на второй монитор. В системе с одним монитором закройте все окна, кроме окна конструктора.
Нажмите клавиши CTRL+ALT+X, чтобы отобразить окно Панель элементов. Если окно закреплено, перетащите его в нужное место.
Нажмите клавишу F5, чтобы включить в Visual Studio режим отладки. Настройте расположение окон отладки Автоматические, Стек вызовов и Выходные данные. Макет, который вы собираетесь создать, применит к ним режим редактирования и режим отладки.
Когда макеты будут открыты в режиме отладки и редактирования, выберите Окно > Сохранить макет окна. Назовите этот макет "Конструктор".
Обратите внимание, что новому макету назначается сочетание клавиш из зарезервированного списка CTRL+ALT+1. 0.
Создание проекта и макета базы данных
Добавьте в решение новый проект База данных SQL Server .
Щелкните правой кнопкой мыши новый проект в обозревателе решений и выберите пункт Просмотр в обозревателе объектов. Отобразится окно Обозреватель объектов SQL Server , в котором можно открывать таблицы, представления и другие объекты в базе данных. Это окно можно переместить или оставить закрепленным. Настройте другие окна средства. Для реалистичности можно добавить существующую базу данных, но это необязательно для данного пошагового руководства.
После настройки макета выберите в главном меню пункт Окно > Сохранить макет окна. Назовите этот макет "Проект базы данных". (Для этого проекта не будет использоваться макет в режиме отладки.)
Переключение между макетами
Для переключения между макетами используйте сочетания клавиш или выберите в главном меню пункт Окно > Применить макет окна.
После применения макета пользовательского интерфейса обратите внимание на то, как выглядит макет в режиме редактирования и в режиме отладки.
Если у вас установлено несколько мониторов на работе и один ноутбук дома, можно создать макеты, оптимизированные для всех компьютеров.
Если макет для нескольких мониторов применить в системе с одним монитором, плавающие окна на втором мониторе будут находиться за окном Visual Studio. Эти окна можно переместить на передний план, нажав клавиши ALT+TAB. Если позже открыть Visual Studio в системе с несколькими мониторами, можно восстановить окна в указанных расположениях, повторно применив макет.
Управление макетами и перемещение их
Пользовательский макет можно удалить, переименовать или переупорядочить. Для этого последовательно выберите элементы Окно > Управление макетами окон. Если переместить макет, привязка ключей будет настроена автоматически и отобразит новое положение в списке. Привязки нельзя изменить другим способом. Таким образом, одновременно можно хранить не больше 10 макетов.
Чтобы вспомнить, какие сочетания клавиш назначены макетам, выберите Окно > Применить макет окна.
Эти макеты автоматически передаются между выпусками Visual Studio, между экземплярами Blend на отдельных компьютерах и из любого выпуска Express в любую другую организацию Express. Но макеты нельзя перемещать между Visual Studio, Blend и Express.
Я хочу, чтобы мое окно было поверх всех остальных окон только в моем приложении . Если я устанавливаю свойство TopMost окна, оно становится поверх всех окон всех приложений, а я этого не хочу.
Хотя вопрос довольно старый, мне просто нужно сделать этот комментарий . Ваш вопрос плюс комментарий довольно странный, вы хотите, чтобы ваше окно было вверху вашего приложения, но в своем комментарии вы указываете, что приложение не запущено так как это первое окно (заставка), так как же ваше окно может быть поверх несуществующего приложения. Это просто заставляет меня задаться вопросом, как вообще этот вопрос мог получить 16 голосов.
Когда приложение запускается, другого окна нет, но вскоре после этого появляется главное окно, которое должно оставаться за экраном-заставкой, пока все не будет загружено.
Вам нужно установить свойство владельца окна.
Вы можете показать окно через showdialog, чтобы заблокировать главное окно, или вы можете показать его как обычно и разместить его поверх владельца, не блокируя владельца.
вот пример кода части codebehind - я пропустил все очевидные вещи:
Это именно то, что я искал - как открыть новое окно, которое сохраняет фокус / активность до закрытия. Спасибо.
Вместо этого вы можете использовать Popup, который всегда будет TopMost, украсить его, как Window, и полностью присоединить его к вашему приложению, обработать событие LocationChanged вашего основного окна и установить для свойства IsOpen Popup значение false.
Редактировать:
Надеюсь, вам нужно что-то вроде этого:
Надеюсь, это поможет.
Если вы настроите окно таким образом, оно будет вести себя так, как вам нужно. Окно будет поверх всех остальных окон в приложении
У меня не сработало "исключение нулевой ссылки". Мой диалог - это окно WPF, но приложение и главное окно - это WinForms.
Это сделает его модальным. Хотите, чтобы вторичное окно находилось перед главным окном, но могло взаимодействовать с главным окном.
Просто сделать это в XAML и удивлен, что никто еще не опубликовал этот ответ. В следующем примере Window объект определен в ResourceLibrary (обратите внимание на x:Key ), но вы также можете использовать эту привязку XAML для автономного Page ресурса WPF в стиле.
используйте метод Activate (). Это пытается вывести окно на передний план и активировать его. например, Window wnd = new xyz (); wnd.Activate ();
Я столкнулся с очень похожей ситуацией, как и вы. Большинство поисковых запросов, с которыми я сталкивался, утверждали, что все, что мне нужно было сделать, это установить Владелец окон, которые я хочу быть наверху, для главного окна или любого другого окна, которое называлось Show.
В любом случае, я опубликую решение, которое хорошо сработало для меня.
Я создал обработчики событий для Window.Activated и Window.Deactived в окне, которое должно было быть самым верхним по отношению к моему приложению.
У меня это отлично работает. Надеюсь, это будет полезно кому-то еще. : o)
Когда я нажимаю на другое приложение, мое окно перестает быть активным, поэтому Topmost никогда не получает значение false.
Мне удалось заставить это работать, проверив Topmost в операторе if, а не IsActive: if (ownWindow.Topmost) .
Во всплывающем окне перегружает метод Show () параметром:
Затем в главном окне вызовите свой перегруженный метод Show ():
Лучше всего установить эти два события для всех окон вашего приложения:
- и, конечно же, все окна, которые вы хотите разместить наверху, должны быть доступны из других окон вашего приложения. в моем случае у меня есть базовое окно и еще несколько окон, которые должны быть наверху моего базового окна, так что это было неплохо, так как в моем базовом окне есть экземпляры каждого другого окна.
Это безупречно работает для создания всплывающих окон или служебных окон, которые не нависают над окнами других приложений, когда они не активны. Спасибо!
Есть несколько тем, есть даже «самый верхний» тег. Выполните поиск по нему или перейдите прямо к этой публикации, которая выглядит хорошо:
Я не могу установить свойство Owner, потому что в моем случае окно создается раньше любых других окон. Поэтому у меня нет другого окна, чтобы установить его владельцем.
Я ОП. После некоторого исследования и тестирования ответ таков:
Нет, нет никакого способа , чтобы сделать именно это.
@ BurakYeniçeri 9 лет спустя . Не знаю. Тогда я пришел к выводу, что это невозможно после множества попыток. Гораздо позже Йоханнес придумал решение, за которое набиралось много голосов, и я полагаю, что это хорошее решение. Я снял флажок "принять" в своем собственном ответе.
Вот способ сделать это: сделать так, чтобы ваше «самое верхнее» окно подписывалось на события GotFocus и LostFocus других окон, и используйте следующие элементы в качестве обработчиков событий:
Вы можете добавить это в свои теги Windows
Затем вы также можете отобразить его, если хотите, чтобы ваши пользователи подтвердили его, чтобы продолжить
Сначала попробуйте без параметров TopMost и посмотрите результаты.
Потому что, если пользователь щелкнет другое окно, которое находится позади, оно не останется наверху. Я хочу, чтобы он всегда был сверху, но я не хочу, чтобы он блокировал другие окна (это то, что делают модальные окна).
Кстати, WindowStartupLocation влияет только на начальные значения свойств Top и Left окна, когда оно открыто; это не влияет на Z-порядок.
В общем, так работают окна инструментов. Например, вы можете отстыковать панель инструментов «Инструменты» в Visual Studio и разместить ее поверх окна кода. Вы по-прежнему можете вводить текст в окнах кода, даже если это окно находится наверху. Если вы поместите Блокнот поверх Visual Studio, Блокнот скроет окно Инструменты. Следовательно, эти окна находятся поверх всех окон в Visual Studio, но не поверх всех окон системы.
Как насчет htis:
Я тоже столкнулся с той же проблемой и ответил на этот вопрос Google. Недавно я обнаружил, что у меня работает следующее.
Я только что столкнулся с этой же проблемой. У меня есть настольное приложение с несколькими окнами WPF, и мне нужно, чтобы мой настраиваемый экран-заставка находился поверх других окон только в моем приложении. Когда появляется мой экран-заставка, другие окна не открываются, но я открываю MainWindow из экрана-заставки после некоторой аутентификации. Итак, я просто сделал что-то похожее на то, что сделал @GlenSlayden, но в коде, поскольку, как я уже сказал, MainWindow не для меня, чтобы я мог привязаться к:
Теперь, когда моя программа загружает все другие окна из MainWindow, экран-заставка находится наверху, но пока программа аутентифицирует пользователя, он не самый верхний, поэтому вы можете щелкнуть другую программу, и она скроется за ней. Это лучшее, что я мог найти для решения этой проблемы. Он не идеален, потому что он по-прежнему работает поверх всех других приложений, пока моя программа загружается после аутентификации, но в моем случае это ненадолго.
1) Начать новый проект.
2) перейдите в Project, затем в New Windows form, затем выберите Windows Form и назовите Splash.
3) установите размер, фон, текст и т. Д. По желанию.
4) В свойствах формы Splash.cs установите Start Position: CenterScreen и TopMost: true.
5) form1 добавить "using System.Threading;"
6) form1 в классе добавить "Splash splashscreen = new Splash ();"
7) form1 добавить "splashscreen.Show ();" и «Application.DoEvents ()»;
8) form1 В разделе События >> Фокус >> Активировано добавьте «Thread.Sleep (4000); splashscreen.Close ();»
9) Добавьте Splash.cs в «Public Splash» добавьте this.BackColor = Color.Aqua; / можно использовать любой цвет
10) Это код для Form1.cs
11) это код на Splash.cs
12) Я обнаружил, что если вы НЕ сделаете что-то в заставке, экран не будет оставаться наверху, пока первая форма должна активироваться. Счетчик потоков исчезнет, всплеск исчезнет через x секунд, поэтому ваша программа работает нормально.
Читайте также: