Я занимаюсь .NET-разработкой уже несколько лет, и это все еще одна из тех вещей, которые я не умею делать правильно. Окно на панели задач легко скрыть с помощью свойства как в Windows Forms, так и в WPF, но, насколько я могу судить, это не гарантирует (или даже не влияет), что оно скрыто из диалогового окна Alt+ ↹Tab. Я видел невидимые окна, отображаемые в Alt+ ↹Tab, и мне просто интересно, как лучше всего гарантировать, что окно никогда не появится (видимое или нет) в диалоговом окне Alt+ ↹Tab.
Обновление: см. Мое опубликованное решение ниже. Мне не разрешено отмечать мои собственные ответы как решение, но пока это единственное, что работает.
Обновление 2: теперь есть подходящее решение от Franci Penov, которое выглядит неплохо, но сам не пробовал. Включает некоторое количество Win32, но избегает неуклюжего создания окон вне экрана.
Ответы:
Обновить:
Согласно @donovan, в наши дни WPF поддерживает это изначально, через настройки
ShowInTaskbar="False"
иVisibility="Hidden"
в XAML. (Я это еще не тестировал, но все же решил поднять видимость комментария)Оригинальный ответ:
Есть два способа скрыть окно от переключателя задач в Win32 API:
WS_EX_TOOLWINDOW
стиль расширенного окна - это правильный подход.К сожалению, WPF не поддерживает такое гибкое управление стилем окна, как Win32, поэтому окно со стилями и
WindowStyle=ToolWindow
по умолчанию заканчивается , что приводит к появлению заголовка и кнопки закрытия. С другой стороны, вы можете удалить эти два стиля, установив , однако при этом не будет установлен расширенный стиль, и окно не будет скрыто от переключателя задач.WS_CAPTION
WS_SYSMENU
WindowStyle=None
WS_EX_TOOLWINDOW
Чтобы окно WPF с
WindowStyle=None
этим также было скрыто от переключателя задач, можно одним из двух способов:WS_EX_TOOLWINDOW
расширенный стиль.Лично я предпочитаю второй подход. С другой стороны, я делаю некоторые продвинутые вещи, такие как расширение стекла в клиентской области и включение WPF-рисования в подписи в любом случае, поэтому небольшое взаимодействие не является большой проблемой.
Вот пример кода подхода к решению взаимодействия Win32. Во-первых, часть XAML:
Здесь нет ничего особенного, мы просто объявляем окно с помощью
WindowStyle=None
иShowInTaskbar=False
. Мы также добавляем обработчик к событию Loaded, в котором мы изменим стиль расширенного окна. Мы не можем выполнить эту работу в конструкторе, так как в этот момент еще нет дескриптора окна. Сам обработчик событий очень прост:И объявления взаимодействия Win32. Я удалил все ненужные стили из перечислений, просто чтобы пример кода здесь был небольшим. Кроме того, к сожалению,
SetWindowLongPtr
точка входа не найдена в user32.dll в Windows XP, отсюда и трюк с маршрутизацией вызова черезSetWindowLong
.источник
Внутри вашего класса формы добавьте это:
Это так просто; работает шарм!
источник
Я нашел решение, но оно не очень хорошее. Пока что это единственное, что я пробовал, что действительно работает:
Нашел здесь .
Было бы неплохо получить более общее решение многократного использования. Я полагаю, вы могли бы создать одно окно 'w' и повторно использовать его для всех окон в вашем приложении, которые необходимо скрыть от Alt+ ↹Tab.
Обновление: Хорошо, поэтому я переместил приведенный выше код без
this.Owner = w
бит (иw.Hide()
сразу после этогоw.Show()
, что отлично работает) в конструктор моего приложения, создав общедоступный статическийWindow
вызовOwnerWindow
. Когда я хочу, чтобы окно демонстрировало такое поведение, я просто устанавливаюthis.Owner = App.OwnerWindow
. Отлично работает и требует создания только одного дополнительного (и невидимого) окна. Вы даже можете установить,this.Owner = null
если хотите, чтобы окно снова появлялось в диалоговом окне Alt+ ↹Tab.Спасибо Ивану Онучину на форумах MSDN за решение.
Update 2: Вы должны также установить
ShowInTaskBar=false
на ,w
чтобы предотвратить его мигания кратко на панели задач , когда показано на рисунке.источник
-100000
Возможно, было бы лучше использовать смещение вроде .Почему так сложно? Попробуй это:
Идея взята отсюда: http://www.csharp411.com/hide-form-from-alttab/
источник
Вот в чем заключается фокус, независимо от стиля окна, от которого вы пытаетесь скрыть Alt+ ↹Tab.
Поместите в конструктор вашей формы следующее:
По сути, вы делаете свою форму дочерним элементом невидимого окна, которое имеет правильный стиль и настройку ShowInTaskbar, чтобы не попадать в список Alt-Tab. Вы также должны установить для свойства ShowInTaskbar вашей формы значение false. Лучше всего то, что просто не имеет значения, какой стиль имеет ваша основная форма, и все настройки для достижения сокрытия - это всего лишь несколько строк в коде конструктора.
источник
Зачем пробовать столько кодов? Просто установите
FormBorderStyle
свойство наFixedToolWindow
. Надеюсь, поможет.источник
см. это: (из http://bytes.com/topic/c-sharp/answers/442047-hide-alt-tab-list#post1683880 )
источник
В XAML установите ShowInTaskbar = "False":
Изменить: я думаю, это все еще отображается в Alt + Tab, но не на панели задач.
источник
Я попытался установить для видимости основной формы значение false всякий раз, когда оно автоматически изменяется на true:
Работает отлично :)
источник
если вы хотите, чтобы форма была без полей, вам нужно добавить следующие операторы в конструктор формы:
И вы должны добавить следующий метод к производному классу Form:
подробнее
источник
Не показывать форму. Используйте невидимость.
Подробнее здесь: http://code.msdn.microsoft.com/TheNotifyIconExample
источник
Свойства Form1:
FormBorderStyle:
Sizable WindowState: Minimized
ShowInTaskbar: False
источник
Лично, насколько я знаю, это невозможно без какого-либо подключения к окнам, я даже не уверен, как это будет сделано и возможно ли это.
В зависимости от ваших потребностей разработка контекста вашего приложения как приложения NotifyIcon (в области уведомлений) позволит ему работать без отображения в ALT + TAB. ОДНАКО, если вы откроете форму, она по-прежнему будет выполнять стандартные функции.
Я могу найти в своем блоге статью о создании приложения, которое по умолчанию является ТОЛЬКО NotifyIcon, если хотите.
источник