Eu sou um desenvolvedor .NET há vários anos e isso ainda é uma das coisas que eu não sei fazer direito. É fácil ocultar uma janela da barra de tarefas por meio de uma propriedade tanto no Windows Forms quanto no WPF, mas, pelo que posso dizer, isso não garante (ou necessariamente afeta) que ela será ocultada da caixa de diálogo Alt+ ↹Tab. Já vi janelas invisíveis aparecerem no Alt+ ↹Tab, e estou apenas imaginando qual é a melhor maneira de garantir que uma janela nunca apareça (visível ou não) na caixa de diálogo Alt+ ↹Tab.
Atualização: por favor, veja minha solução postada abaixo. Não tenho permissão para marcar minhas próprias respostas como a solução, mas até agora é a única que funciona.
Atualização 2: Agora há uma solução adequada de Franci Penov que parece muito boa, mas ainda não experimentei. Envolve algum Win32, mas evita a criação deficiente de janelas fora da tela.
Respostas:
Atualizar:
De acordo com @donovan, o WPF moderno dá suporte a isso nativamente, por meio da configuração
ShowInTaskbar="False"
eVisibility="Hidden"
no XAML. (Eu não testei isso ainda, mas decidi aumentar a visibilidade do comentário)Resposta original:
Existem duas maneiras de ocultar uma janela do alternador de tarefas na API Win32:
WS_EX_TOOLWINDOW
estilo de janela estendida - essa é a abordagem certa.Infelizmente, o WPF não oferece suporte a um controle tão flexível sobre o estilo de janela como o Win32, portanto, uma janela
WindowStyle=ToolWindow
com o padrãoWS_CAPTION
eWS_SYSMENU
estilos, o que faz com que tenha uma legenda e um botão Fechar. Por outro lado, você pode remover esses dois estilos configurandoWindowStyle=None
, no entanto, isso não definirá oWS_EX_TOOLWINDOW
estilo estendido e a janela não ficará oculta do alternador de tarefas.Para ter uma janela WPF
WindowStyle=None
que também está oculta do alternador de tarefas, pode-se de duas maneiras:WS_EX_TOOLWINDOW
estilo estendido.Eu pessoalmente prefiro a segunda abordagem. Então, novamente, eu faço algumas coisas avançadas como estender o vidro na área do cliente e habilitar o desenho WPF na legenda de qualquer maneira, então um pouco de interoperabilidade não é um grande problema.
Aqui está o código de exemplo para a abordagem de solução de interoperabilidade Win32. Primeiro, a parte XAML:
Nada muito sofisticado aqui, apenas declaramos uma janela com
WindowStyle=None
eShowInTaskbar=False
. Também adicionamos um manipulador ao evento Loaded, onde modificaremos o estilo da janela estendida. Não podemos fazer esse trabalho no construtor, pois ainda não há nenhum identificador de janela nesse ponto. O próprio manipulador de eventos é muito simples:E as declarações de interoperabilidade do Win32. Removi todos os estilos desnecessários dos enums, apenas para manter pequeno o código de amostra aqui. Além disso, infelizmente, o
SetWindowLongPtr
ponto de entrada não foi encontrado em user32.dll no Windows XP, daí o truque de rotear a chamada através doSetWindowLong
.fonte
Dentro de sua classe de formulário, adicione isto:
É tão fácil assim; funciona um encanto!
fonte
Eu encontrei uma solução, mas não é bonita. Até agora, esta é a única coisa que tentei que realmente funciona:
Encontrei aqui .
Uma solução mais geral e reutilizável seria boa. Suponho que você possa criar uma única janela 'w' e reutilizá-la para todas as janelas do seu aplicativo que precisam ser ocultadas do Alt+ ↹Tab.
Update: Ok, então o que fiz foi mover o código acima, sem o
this.Owner = w
bit (e moverw.Hide()
imediatamente depoisw.Show()
, o que funciona bem) para o construtor do meu aplicativo, criando uma estática públicaWindow
chamadaOwnerWindow
. Sempre que desejo que uma janela exiba esse comportamento, simplesmente a definothis.Owner = App.OwnerWindow
. Funciona muito bem e envolve apenas a criação de uma janela extra (e invisível). Você pode até definirthis.Owner = null
se deseja que a janela reapareça na caixa de diálogo Alt+ ↹Tab.Obrigado a Ivan Onuchin nos fóruns do MSDN pela solução.
Update 2: Você também deve definir
ShowInTaskBar=false
sobrew
a impedi-lo de piscar brevemente na barra de tarefas quando mostrado.fonte
-100000
provavelmente seria melhor.Por que tão complexo? Experimente isto:
Ideia tirada aqui: http://www.csharp411.com/hide-form-from-alttab/
fonte
Aqui está o que faz o truque, independentemente do estilo da janela você está tentando esconder de Alt+ ↹Tab.
Coloque o seguinte no construtor do seu formulário:
Essencialmente, você torna seu formulário filho de uma janela invisível que possui o estilo correto e a configuração ShowInTaskbar para ficar fora da lista Alt-Tab. Você também deve definir a propriedade ShowInTaskbar do seu próprio formulário como false. O melhor de tudo é que simplesmente não importa o estilo do seu formulário principal, e todos os ajustes para realizar a ocultação são apenas algumas linhas no código do construtor.
fonte
Por que tentar tantos códigos? Basta definir a propriedade
FormBorderStyle
paraFixedToolWindow
. Espero que ajude.fonte
veja: (de http://bytes.com/topic/c-sharp/answers/442047-hide-alt-tab-list#post1683880 )
fonte
Em XAML, defina ShowInTaskbar = "False":
Edit: Isso ainda mostra em Alt + Tab, eu acho, mas não na barra de tarefas.
fonte
Tentei definir a visibilidade do formulário principal como falsa sempre que ele é alterado automaticamente para verdadeiro:
Funciona perfeitamente :)
fonte
se quiser que o formulário não tenha bordas, será necessário adicionar as seguintes instruções ao construtor do formulário:
E você deve adicionar o seguinte método à sua classe derivada de Form:
mais detalhes
fonte
Não mostre um formulário. Use a invisibilidade.
Mais aqui: http://code.msdn.microsoft.com/TheNotifyIconExample
fonte
Propriedades do Form1:
FormBorderStyle: Sizable
WindowState: Minimized
ShowInTaskbar: False
fonte
Pessoalmente, pelo que sei, isso não é possível sem enganchar nas janelas de alguma forma, nem tenho certeza de como isso seria feito ou se é possível.
Dependendo de suas necessidades, desenvolver seu contexto de aplicativo como um aplicativo NotifyIcon (bandeja do sistema) permitirá que ele seja executado sem ser exibido em ALT + TAB. NO ENTANTO, se você abrir um formulário, esse formulário ainda seguirá a funcionalidade padrão.
Posso desenterrar o artigo do meu blog sobre a criação de um aplicativo que é SOMENTE um NotifyIcon por padrão, se você quiser.
fonte