Como posso trazer meu aplicativo WPF para a frente da área de trabalho? Até agora eu tentei:
SwitchToThisWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle, true);
SetWindowPos(new WindowInteropHelper(Application.Current.MainWindow).Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle);
Nenhuma delas está realizando o trabalho ( Marshal.GetLastWin32Error()
está dizendo que essas operações foram concluídas com êxito e os atributos P / Invoke para cada definição SetLastError=true
).
Se eu criar um novo aplicativo WPF em branco e ligar SwitchToThisWindow
com um timer, ele funcionará exatamente como o esperado, portanto, não sei por que ele não está funcionando no meu caso original.
Edit : Eu estou fazendo isso em conjunto com uma tecla de atalho global.
Respostas:
Tenta trazer a janela para o primeiro plano e a ativa.
Isso deve funcionar, a menos que eu entenda mal e você queira o comportamento Sempre no topo. Nesse caso, você deseja:
fonte
Topmost
propriedade é uma prática ruim, pois pode ocultar outras caixas de diálogo pop-up e ter um comportamento inesperado.if (myWindow.WindowState == WindowState.Minimized) myWindow.WindowState = WindowState.Normal;
Estranhamente, ele também preservará todas as janelas Maximized e não as reverterá para um estado Normal.Eu encontrei uma solução que traz a janela para o topo, mas se comporta como uma janela normal:
fonte
Window.Focus()
. Isso desviará o foco do que o usuário está digitando no momento em uma caixa de texto, o que é extremamente frustrante para os usuários finais. O código acima funciona muito bem sem ele.Caso você precise que a janela esteja na frente na primeira vez que ela for carregada, use o seguinte:
fonte
Para tornar este um processo rápido de copiar e colar -
Use esta classe '
DoOnProcess
método para mover a janela principal do processo' para o primeiro plano (mas não para roubar o foco de outras janelas)HTH
fonte
process.MainWindowHandle
?hWnd
. FWIW umHwndSource
objeto funcionou bem.Sei que essa pergunta é bastante antiga, mas acabei de me deparar com esse cenário preciso e queria compartilhar a solução que implementei.
Conforme mencionado nos comentários desta página, várias das soluções propostas não funcionam no XP, que eu preciso apoiar no meu cenário. Embora eu concorde com o sentimento de @Matthew Xavier de que geralmente essa é uma prática ruim de UX, há momentos em que é uma UX totalmente plausível.
A solução para trazer uma janela WPF para o topo foi realmente fornecida pelo mesmo código que estou usando para fornecer a tecla de atalho global. Um artigo de blog de Joseph Cooney contém um link para seus exemplos de código que contém o código original.
Limpei e modifiquei um pouco o código e o implementei como um método de extensão para System.Windows.Window. Eu testei isso no XP 32 bits e no Win7 64 bits, e ambos funcionam corretamente.
Espero que esse código ajude outras pessoas que encontram esse problema.
fonte
this.Activate()
parece funcionar algumas vezes.Se o usuário estiver interagindo com outro aplicativo, talvez não seja possível trazer o seu para a frente. Como regra geral, um processo só pode esperar definir a janela de primeiro plano se esse processo já for o primeiro plano. (A Microsoft documenta as restrições na entrada do MSDN SetForegroundWindow () .) Isso ocorre porque:
fonte
Eu sei que esta é uma resposta tardia, talvez útil para pesquisadores
fonte
Por que algumas das respostas desta página estão erradas!
Qualquer resposta usada
window.Focus()
está errada.window.Focus()
o foco será desviado do que o usuário estiver digitando no momento. Isso é insanamente frustrante para os usuários finais, especialmente se os pop-ups ocorrerem com bastante frequência.Qualquer resposta usada
window.Activate()
está errada.window.ShowActivated = false
está errada.Visibility.Visible
para ocultar / mostrar a janela está errada.window.Show()
ewindow.Hide()
.Essencialmente:
Solução MVVM
Este código é 100% compatível com o Citrix (sem áreas em branco na tela). É testado com o WPF e o DevExpress normais.
Esta resposta é destinada a qualquer caso de uso em que desejamos uma pequena janela de notificação sempre à frente de outras janelas (se o usuário selecionar isso nas preferências).
Se essa resposta parece mais complexa que as outras, é porque é um código robusto no nível da empresa. Algumas das outras respostas nesta página são simples, mas na verdade não funcionam.
XAML - Propriedade anexada
Adicione esta propriedade anexada a qualquer uma
UserControl
dentro da janela. A propriedade anexada irá:Loaded
evento seja disparado (caso contrário, ele não poderá procurar na árvore visual para encontrar a janela pai).A qualquer momento, você pode definir a janela para ficar na frente ou não, invertendo o valor da propriedade anexada.
Método auxiliar
Uso
Para usar isso, você precisa criar a janela no seu ViewModel:
Links adicionais
Para obter dicas sobre como garantir que uma janela de notificação sempre volte para a tela visível, veja minha resposta: No WPF, como mudar uma janela para a tela se estiver fora da tela? .
fonte
catch (Exception) { }
. Sim, certo ... E ele usa código que nem é mostrado na resposta como_dialogService
ouShiftWindowOntoScreenHelper
. Além disso pedindo para criar a janela no lado viewmodel (que basicamente quebra todo o padrão MVVM) ...Func<>
vinculado ao ViewModel.Eu tive um problema semelhante com um aplicativo WPF que é chamado de um aplicativo Access através do objeto Shell.
Minha solução está abaixo - funciona em XP e Win7 x64 com aplicativo compilado para o destino x86.
Prefiro fazer isso do que simular uma tabulação alternativa.
fonte
Bem, já que esse é um assunto tão quente ... aqui está o que funciona para mim. Eu recebi erros se não fiz dessa maneira, porque Activate () apresentará um erro se você não puder ver a janela.
Xaml:
Código por trás:
Essa era a única maneira de eu mostrar a janela no topo. Em seguida, ative-o para que você possa digitar na caixa sem precisar definir o foco com o mouse. control.Focus () não funcionará, a menos que a janela esteja Active ();
fonte
Bem, eu descobri uma solução. Estou fazendo a ligação usando um gancho de teclado usado para implementar uma tecla de atalho. A chamada funciona como esperado se eu colocá-la em um BackgroundWorker com uma pausa. É uma ilusão, mas não tenho idéia do por que não estava funcionando originalmente.
fonte
Para mostrar QUALQUER janela aberta no momento, importe essas DLL:
e no programa Buscamos o aplicativo com o título especificado (escreva o título sem a primeira letra (índice> 0))
fonte
IndexOf
corretamente?O problema pode ser que o encadeamento que chama seu código do gancho não foi inicializado pelo tempo de execução, portanto, métodos de tempo de execução de chamada não funcionam.
Talvez você possa tentar fazer uma chamada para organizar seu código no thread da interface do usuário para chamar seu código que traz a janela para o primeiro plano.
fonte
Esses códigos funcionarão bem o tempo todo.
Primeiro defina o manipulador de eventos ativado no XAML:
Adicione abaixo da linha ao seu bloco construtor da Janela Principal:
E dentro do manipulador de eventos ativado, copie estes códigos:
Essas etapas funcionarão bem e trarão para a frente todas as outras janelas na janela dos pais.
fonte
Se você está tentando ocultar a janela, por exemplo, minimiza a janela, descobri que usar
irá ocultá-lo corretamente, então simplesmente usando
mostrará a janela como o item mais alto novamente.
fonte
Só queria adicionar outra solução para esta pergunta. Essa implementação funciona no meu cenário, onde o CaliBurn é responsável por exibir a janela principal.
fonte
Lembre-se de não colocar o código que mostra essa janela dentro de um manipulador PreviewMouseDoubleClick, pois a janela ativa retornará à janela que manipulou o evento. Basta colocá-lo no manipulador de eventos MouseDoubleClick ou parar de borbulhar definindo e.Handled como True.
No meu caso, eu estava lidando com o PreviewMouseDoubleClick em um Listview e não estava definindo o e.Handled = true; em seguida, ele levantou o evento MouseDoubleClick, que voltou a focalizar a janela original.
fonte
Criei um método de extensão para facilitar a reutilização.
Chamar no construtor de formulários
fonte