Trazer janela para a frente em C # usando Win32 API

votos
35

Estou escrevendo um aplicativo que precisa para trazer a janela de um aplicativo externo para o primeiro plano, e não necessariamente roubar foco (há uma definição do usuário pode alternar para roubar / não roubar foco).

Qual é a melhor maneira de fazer isso usando a API do win32? Eu tentei SetForeground (), mas ele sempre rouba o foco e não consistenly trabalhar.

Qual é a melhor maneira de ir sobre isso? Alguma ideia?

Publicado 06/08/2008 em 01:55
fonte usuário
Em outras línguas...                            


6 respostas

votos
14

SetForegroundWindow é suposto para roubar o foco e há certos casos em que ele irá falhar.

A função SetForegroundWindow coloca o segmento que criou a janela especificada para o primeiro plano e ativa a janela. A entrada de teclado é dirigida para a janela

Tente capturar o foco com SetCapture antes de fazer a chamada. Também olhar para diferentes maneiras de trazer a janela para a frente: SetForegroundWindow, SetActiveWindow, mesmo simulando um clique do mouse pode fazer isso.

Respondeu 06/08/2008 em 02:06
fonte usuário

votos
5

Qual é a diferença entre SetForegroundWindow, SetActiveWindow e BringWindowToTop? Parece que todos eles fazem a mesma coisa.

De acordo com MSDN, SetForegroundWindow irá ativar a janela e o foco do teclado direto a ele. Este tenta trabalhar mesmo quando o processo está em segundo plano. SetActiveWindow faz a mesma coisa como SetForegroundWindow, mas não faz nada se a sua aplicação não é o aplicativo mais à frente. Finalmente, BringWindowToTop só traz a janela para o topo, e não muda o foco do teclado.

Respondeu 06/08/2008 em 14:20
fonte usuário

votos
2

Você já tentou usar SetWindowPos. Esta é a função canônica para mover, redimensionar e definir ordem z no Windows. Há uma bandeira SWP_NOACTIVATE você pode usar. Olhe para http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx . Eu não tentei isso em uma janela pertencente a outro processo, mas é provavelmente vale a pena tentar.

Respondeu 24/08/2008 em 22:51
fonte usuário

votos
2

Você pode tentar a função BringWindowToTop para não roubar o foco. Eu não tê-lo usado, mas parece ser o que você está procurando.

Respondeu 06/08/2008 em 02:37
fonte usuário

votos
1

SetWindowPos + SWP_NOACTIVATE faz o trabalho.

Respondeu 18/12/2009 em 08:23
fonte usuário

votos
0

Você poderia usar FindWindow para obter o HWND da janela, em seguida, usar a função BringWindowToTop encontrada na API Win32.

Respondeu 06/05/2011 em 15:44
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more