2012-07-16 20 views
15

Estoy buscando alternativas a la versión anterior User32.dll de cambiar a una aplicación diferente con FindWindow() y SetForegroundWindow().¿Alternativas FindWindow y SetForegroundWindow?

Encontré una alternativa a la primera con el uso de Process.GetProcessesByName() pero no veo el método correspondiente para cambiar (establecer activo/primer plano) a esa aplicación.

¿Hay alguna manera de hacerlo sin usar el antiguo manera con el User32.dll?

Gracias por su ayuda.

EDITAR

acepté la respuesta de @Sorceri aunque no es la respuesta que estaba buscando.

+2

¿Qué hay de malo en usar 'SetForegroundWindow'? El sistema operativo Windows realiza un seguimiento de la ventana de primer plano en el subsistema Win32, así que, como sea que lo haga, va a ser P/Invocar a 'user32.dll' de todos modos. –

+0

@MichaelGraczyk: O al menos, suponemos que con seguridad ... :) –

+1

En el escritorio de Windows tengo que usar 'user32.dll' en Windows CE Tengo que usar' coredll.dll'. Entonces, usar un 'DLLImport' siempre muestra que usted agrega una dependencia estática que es incorrecta. – fdomig

Respuesta

27

Respuesta: No.

Pero, para ayudar a la próxima wonderer en busca de encontrar una ventana y activarlo desde C# esto es lo que tiene que hacer:

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

void ActivateApp(string processName) 
{ 
    Process[] p = Process.GetProcessesByName(processName); 

    // Activate the first application we find with this name 
    if (p.Count() > 0) 
     SetForegroundWindow(p[0].MainWindowHandle); 
} 

Para traer el bloc de notas en la parte delantera, por ejemplo, que podríamos llamar:

ActivateApp("notepad"); 

Como nota al margen - para aquellos de ustedes que están tratando de llevar wi ndow en su aplicación al primer plano simplemente llame al Activate() method.

+0

Entonces, después de utilizar este método para mostrar el proceso deseado, ¿podría usar SendKeys.SendWait ("{ENTER}") de manera viable? sin reparos, siempre que mi aplicación realmente responda a las teclas presionadas – HanH1113

+0

La documentación en SendWait sugiere que puede - ¡háganos saber si funciona! – noelicus

+0

Lo he intentado y lo extraño es que funciona A VECES, lo que me parece realmente extraño para las máquinas. El problema es que las computadoras siempre hacen lo que les decimos, no necesariamente lo que queremos. Puede que tenga que hacer una nueva pregunta. – HanH1113

1

Puede usar System.Diagnostics.Process Object para un equivalente de FindWindow. Actualmente no hay un equivalente para SetForegroundWindow. Deseará usar Pinvoke con SetForgroundWindow.

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 
+1

¿Qué significa que todavía tengo que ocuparme de user32.dll después de todo? Suena extraño de alguna manera que no hay alternativa ... – fdomig

3

Usted podría utilizar SetActiveWindow como una alternativa a SetForeGroundWindow. Yo diría que deberías revisar todo el Windows Manipulation Api Functions y ver si hay algo que te estás perdiendo.

Además, tenga en cuenta que puede obtener el control del objeto System.Diagnostics.Process a través de la propiedad Process.Handle.

2

Una alternativa a SetForegroundWindow es AppActivate de VisualBasic

llamada como este

Microsoft.VisualBasic.Interaction.AppActivate("WindowTitle") 

El hecho de que se encuentra en el espacio de nombres VisualBasic no significa que no pueda utilizarlo en C#.

documentación completa here