2012-04-30 63 views
5

Estoy intentando iniciar un proceso externo en una aplicación de Visual C# 2010 - Windows Forms. El objetivo es comenzar el proceso como una ventana oculta y mostrar la ventana en otro momento.¿Cómo ocultar/mostrar un proceso en C#?

He actualizado mi progreso:

//Initialization 
[DllImport("user32.dll")] 
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow); 
[DllImport("user32.dll")] 
private static extern bool EnableWindow(IntPtr hwnd, bool enable); 
[DllImport("user32.dll")] 
private static extern bool MoveWindow(IntPtr handle, int x, int y, int width, 
int height, bool redraw); 

SW_SHOW = 5; 

A continuación se colocó en mi función principal:

ProcessStartInfo info = new ProcessStartInfo("process.exe"); 
info.WindowStyle = ProcessWindowStyle.Hidden; 
Process p = Process.Start(info); 

p.WaitForInputIdle(); 
IntPtr HWND = p.MainWindowHandle; 

System.Threading.Thread.Sleep(1000);  

ShowWindow(HWND, SW_SHOW); 
EnableWindow(HWND, true); 
MoveWindow(HWND, 0, 0, 640, 480, true); 

Sin embargo, debido a que la ventana se inició como "oculta", p.MainWindowHandle = 0. No puedo mostrar la ventana correctamente. También probé HWND = p.Handle sin éxito.

¿Hay alguna manera de proporcionar un nuevo identificador a mi ventana? Esto podría solucionar mi problema.

Referencias:

MSDN ShowWindow

MSDN Forums

How to Import .dll

+1

Ocultación de un proceso? (dudoso) - u ocultar una forma? –

+0

Ocultar la ventana de un proceso. En aras de la argumentación, supongamos que es Internet Explorer: 'ProcessStartInfo info = new ProcessStartInfo (" iexplore ");' –

+0

CreateNoWindow solo funciona en una aplicación de modo de consola. Hidden requiere una aplicación GUI para cooperar y prestar atención al argumento 'nCmdShow' que Windows pasa a su función WinMain(). Sin embargo, a menudo se ignora. No hay nada que puedas hacer aparte de contactar al propietario. –

Respuesta

10

Por último, el proceso está funcionando correctamente. Gracias a toda su ayuda, se me ocurrió esta solución.

p.MainWindowHandle era 0, así que tuve que usar la función user FindWindow() para obtener el identificador de ventana.

//Initialization 
int SW_SHOW = 5; 

[DllImport("user32.dll",SetLastError=true)] 
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

[DllImport("user32.dll")] 
private static extern bool ShowWindow(IntPtr hwnd, WindowShowStyle nCmdShow); 

[DllImport("user32.dll")] 
private static extern bool EnableWindow(IntPtr hwnd, bool enabled); 

Y en mi función principal:

ProcessStartInfo info = new ProcessStartInfo(); 
info.FileName = "notepad"; 
info.UseShellExecute = true; 
info.WindowStyle = ProcessWindowStyle.Hidden; 

Process p = Process.Start(info); 
p.WaitForInputIdle(); 
IntPtr HWND = FindWindow(null, "Untitled - Notepad"); 

System.Threading.Thread.Sleep(1000); 

ShowWindow(HWND, SW_SHOW); 
EnableWindow(HWND, true); 

Referencias:

pinvoke.net: FindWindow()

+0

Hola Matt, gracias por compartir. Sé que esto es tarde, pero cuando pruebo este código, Visual Studio no puede reconocer 'WindowShowStyle'. Revisé todos los enlaces que me proporcionó, pero no puedo encontrar ninguna mención de este tipo. ¿Podría decirme de dónde procede? (Me refiero al tipo del segundo parámetro en la declaración de importación 'ShowWindow') – Bassie

1

Los detalles documention que para usar ProcessWindowStyle.Hidden También debe establecer ProcessStartInfo.UseShellExecute a falso. http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle.aspx

Debería saber de alguna manera el identificador de ventana para mostrarlo más tarde.

+0

Proporcione la documentación. Las pruebas muestran que 'ProcessStartInfo.UseShellExecute = true' es la única forma en que' ProcessWindowStyle.Hidden' funcionará. –

+1

mirando hacia arriba ProcessWindowStyle en MSDN fue asumido; pero he agregado el enlace por ti. –

+0

Gracias. Lamentablemente, por cualquier razón, no funciona en mi caso. Como mencioné anteriormente, probé con 'true' y' false'. Mientras usaba 'false', la ventana no se ocultaba. –

2

Código de ejemplo para mostrar la ventana:

int hWnd; 
Process[] processRunning = Process.GetProcesses(); 
foreach (Process pr in processRunning) 
{ 
    if (pr.ProcessName == "notepad") 
    { 
     hWnd = pr.MainWindowHandle.ToInt32(); 
     ShowWindow(hWnd, SW_HIDE); 
    } 
} 
+0

Déjame intentar esto cuando llegue a casa. Si funciona, lo aceptaré. ¿No hay un método de ventana de búsqueda? –

+0

Después de volver a leer esto, tengo más preocupaciones. No hay forma de saber que pr es * mi * proceso. Por ejemplo, ¿qué pasa si mi programa abre dos ventanas de bloc de notas? Me pregunto si hay una mejor manera de identificar la ventana que abrí. –

Cuestiones relacionadas