Eu tenho um aplicativo winforms C # que executa uma macro em outro programa. O outro programa abrirá janelas continuamente e geralmente fará as coisas parecerem, por falta de uma palavra melhor, malucas. Quero implementar um botão de cancelamento que interromperá a execução do processo, mas não consigo fazer com que a janela permaneça no topo. Como faço isso em C #?
Edit: Eu tentei TopMost = true; , mas o outro programa continua exibindo suas próprias janelas por cima. Existe uma maneira de enviar minha janela para o topo a cada n milissegundos?
Edit: A maneira como resolvi isso foi adicionando um ícone na bandeja do sistema que cancelará o processo clicando duas vezes nele. O ícone da bandeja do sistema não fica encoberto. Obrigado a todos que responderam. Eu li o artigo sobre por que não há uma janela 'super no topo' ... logicamente, não funciona.
Respostas:
Form.TopMost
funcionará a menos que o outro programa esteja criando as janelas superiores.Não há como criar uma janela que não seja coberta pelas novas janelas superiores de outro processo. Raymond Chen explicou o porquê.
fonte
Form.ActiveForm.TopMost
Eu estava procurando fazer meu aplicativo WinForms "Always On Top", mas a configuração de "TopMost" não funcionou para mim. Eu sabia que era possível porque o WinAmp faz isso (junto com uma série de outros aplicativos).
O que fiz foi ligar para "user32.dll". Eu não tive escrúpulos em fazer isso e funciona muito bem. É uma opção, de qualquer maneira.
Primeiro, importe o seguinte namespace:
Adicione algumas variáveis à sua declaração de classe:
Adicionar protótipo para a função user32.dll:
Então, em seu código (adicionei a chamada em Form_Load ()), adicione a chamada:
Espero que ajude. Referência
fonte
Se por "enlouquecer" você quer dizer que cada janela continua roubando o foco da outra, o TopMost não resolverá o problema.
Em vez disso, tente:
Isso mostrará a forma 'criança' sem roubar o foco. O formulário filho também ficará em cima de seu pai, mesmo se o pai estiver ativado ou focado. Este código só funciona facilmente se você tiver criado uma instância do formulário filho de dentro do formulário do proprietário. Caso contrário, pode ser necessário definir o proprietário usando a API.
fonte
CalledForm.Owner
para si mesmo (CalledForm
) causaráSystem.ArgumentException
: 'Uma referência de controle circular foi feita. Um controle não pode ser de propriedade ou pai dele mesmo. 'Definir Form.TopMost
fonte
Eu tive um lapso momentâneo de 5 minutos e esqueci de especificar o formulário completo assim:
Mas o que eu realmente queria era ISSO!
fonte
Defina a
.TopMost
propriedade do formulário como true.Você provavelmente não vai querer deixá-lo assim o tempo todo: configure-o quando o processo externo iniciar e coloque-o de volta quando terminar.
fonte
A maneira como resolvi isso foi criando um ícone na bandeja do sistema com a opção de cancelar.
fonte
O código a seguir faz com que a janela sempre fique no topo, além de torná-la sem moldura.
fonte
Qual é o outro aplicativo cuja visibilidade você está tentando suprimir? Você investigou outras maneiras de alcançar o efeito desejado? Faça isso antes de sujeitar seus usuários a comportamentos maliciosos como você está descrevendo: o que você está tentando fazer parece mais com o que certos sites maliciosos fazem com as janelas do navegador ...
Pelo menos tente seguir a regra da Menos Surpresa . Os usuários esperam poder determinar a ordem z da maioria dos aplicativos por conta própria. Você não sabe o que é mais importante para eles, então, se mudar alguma coisa, você deve se concentrar em empurrar o outro aplicativo por trás de tudo, em vez de promover o seu próprio.
É claro que isso é mais complicado, já que o Windows não tem um gerenciador de janelas particularmente sofisticado. Duas abordagens se sugerem:
fonte
Por que não transformar seu formulário em uma caixa de diálogo:
fonte
TopMost = true
forçou meu formulário acima de tudo, incluindo o cromo, quando na realidade é apenas uma caixa de configurações e eu precisava dela em cima do formulário principal. Parabéns para você, pessoa da Internet.Aqui está o equivalente a SetForegroundWindow:
Já vi pessoas fazendo coisas estranhas como:
http://blog.jorgearimany.com/2010/10/win32-setforegroundwindow-equivalent-in.html
fonte
this.Show(); this.Activate(); this.BringToFront();
mas essa resposta nos levou a essa solução. Obrigado!Eu sei que isso é antigo, mas não vi essa resposta.
Na janela (xaml) adicione:
No código por trás de Window_Deactivated:
Isso manterá sua janela no topo.
fonte
Com base na resposta de Clamum e no comentário de Kevin Vuilleumier sobre a outra sinalização responsável pelo comportamento, fiz essa alternância que alterna entre no topo e não no topo com um toque de botão.
fonte