2012-04-30 19 views
5

Sto tentando di avviare un processo esterno in Visual C# 2010 - Applicazione Windows Form. L'obiettivo è avviare il processo come una finestra nascosta e mostrare la finestra in un secondo momento.Come nascondere/mostrare un processo in C#?

ho aggiornato il mio progresso:

//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; 

Quanto segue è stato messo nella mia funzione principale:

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); 

Tuttavia, poiché la finestra era iniziato come "nascosto", p.MainWindowHandle = 0. Non riesco a mostrare correttamente la finestra. Ho anche provato HWND = p.Handle senza successo.

C'è un modo per fornire un nuovo handle alla mia finestra? Questo potrebbe potenzialmente risolvere il mio problema.

Riferimenti:

MSDN ShowWindow

MSDN Forums

How to Import .dll

+1

Nascondere un processo? (dubbia) - o nascondendo un modulo? –

+0

Nascondere la finestra di un processo. Per ragioni, supponiamo che sia internet explorer: 'ProcessStartInfo info = new ProcessStartInfo (" iexplore ");' –

+0

CreateNoWindow funziona solo su un'app in modalità console. Hidden richiede un'app GUI per cooperare e prestare attenzione all'argomento 'nCmdShow' che Windows passa alla sua funzione WinMain(). Questo tuttavia è spesso ignorato. Nulla che puoi fare al riguardo se non contattare il proprietario. –

risposta

10

Infine, il processo sta funzionando correttamente. Grazie a tutto il tuo aiuto, ho trovato questa soluzione.

Il p.MainWindowHandle era 0, quindi ho dovuto utilizzare la funzione user32 FindWindow() per ottenere l'handle della finestra.

//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); 

E nella mia funzione principale:

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); 

Riferimenti:

pinvoke.net: FindWindow()

+0

Ciao Matt, grazie per la condivisione. So che è tardi, ma quando provo questo codice, Visual Studio non può riconoscere 'WindowShowStyle'. Ho controllato tutti i link che hai fornito ma non riesco a trovare alcun riferimento a questo tipo: potresti per favore comunicarmi da dove proviene? (Mi riferisco al tipo del 2 ° parametro nella dichiarazione di importazione 'ShowWindow') – Bassie

1

I dettagli documention che per usare ProcessWindowStyle.Hidden è necessario impostare anche ProcessStartInfo.UseShellExecute false. http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle.aspx

In qualche modo dovresti conoscere l'handle della finestra per visualizzarlo in seguito.

+0

Fornire documentazione. Il test mostra che 'ProcessStartInfo.UseShellExecute = true' è l'unico modo in cui' ProcessWindowStyle.Hidden' funzionerà. –

+1

la ricerca di ProcessWindowStyle su MSDN è stata presupposta; ma ho aggiunto il link per te. –

+0

Grazie. Sfortunatamente, per qualche ragione, non funziona nel mio caso. Come detto sopra, ho provato con 'true' e' false'. Durante l'uso di 'false', la finestra non è riuscita a nascondersi. –

2

codice di esempio Per mostrare la finestra:

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

Lasciami provare questo quando torno a casa. Se funziona, lo accetterò. Non c'è un metodo per trovare la finestra? –

+0

Dopo averlo riletto, ho ulteriori dubbi. Non c'è modo di sapere che pr è il * mio * processo. Ad esempio, cosa succede se il mio programma ha aperto due finestre di blocco note? Mi chiedo se c'è un modo migliore per identificare la finestra che ho aperto. –

Problemi correlati