2012-04-30 7 views
5

Próbuję uruchomić proces zewnętrzny w aplikacji Visual C# 2010 - Windows Forms. Celem jest rozpoczęcie procesu jako ukrytego okna i odkrycie okna w późniejszym czasie.Jak ukryć/odkryć proces w języku C#?

zaktualizowałem moje postępy:

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

Poniższa został umieszczony w moim głównym funkcji:

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

Jednakże, ponieważ okno było rozpoczął jako "ukryty" p.MainWindowHandle = 0. Nie jestem w stanie wyświetlić okna. Próbowałem również HWND = p.Handle bez powodzenia.

Czy istnieje sposób na dostarczenie nowego uchwytu do mojego okna? To może potencjalnie rozwiązać mój problem.

Referencje:

MSDN ShowWindow

MSDN Forums

How to Import .dll

+1

Ukrywanie procesu? (podejrzany) - czy ukrywasz formularz? –

+0

Ukrywanie okna procesu. Dla dobra argumentu załóżmy, że jest to przeglądarka internetowa: 'ProcessStartInfo info = new ProcessStartInfo (" iexplore ");' –

+0

CreateNoWindow działa tylko w aplikacji trybu konsoli. Ukryty wymaga współpracy aplikacji GUI i zwracania uwagi na argument 'nCmdShow', który system Windows przekazuje do swojej funkcji WinMain(). Jest to jednak często ignorowane. Nic, co możesz z tym zrobić poza skontaktowaniem się z właścicielem. –

Odpowiedz

10

Wreszcie, proces działa prawidłowo. Dzięki Wam wszystkim, wpadłem na tę poprawkę.

P.MainWindowHandle miała wartość 0, więc musiałem użyć funkcji user32 FindWindow(), aby uzyskać uchwyt okna.

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

I w moim głównych funkcji:

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

Referencje:

pinvoke.net: FindWindow()

+0

Cześć Matt dzięki za udostępnienie. Wiem, że jest późno, ale kiedy próbuję tego kodu, Visual Studio nie może rozpoznać 'WindowShowStyle'. Sprawdziłem wszystkie podane linki, ale nie mogę znaleźć żadnej wzmianki tego typu - czy możesz mi powiedzieć, skąd to pochodzi? (Mam na myśli typ drugiego parametru w deklaracji importu "ShowWindow") – Bassie

1

Dane dokumentację, że do korzystania z ProcessWindowStyle.Hidden należy także ustawić ProcessStartInfo.UseShellExecute false. http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle.aspx

Musisz jakoś znać uchwyt okna, aby go później odkryć.

+0

Proszę podać dokumentację. Testowanie pokazuje, że 'ProcessStartInfo.UseShellExecute = true' jest jedynym sposobem, w jaki działa' ProcessWindowStyle.Hidden'. –

+1

Wyszukując ProcessWindowStyle na MSDN został przyjęty; ale dodałem link dla ciebie. –

+0

Dziękuję. Niestety, z jakiegokolwiek powodu, nie działa w moim przypadku. Jak wspomniano powyżej, testowałem zarówno z "true" i "false". Podczas używania 'false', okno nie udało się ukryć. –

2

Przykładowy kod odkryć okno:

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

Pozwól mi spróbować, kiedy wrócę do domu. Jeśli to zadziała, zaakceptuję to. Czy nie ma metody okna wyszukiwania? –

+0

Po ponownym przeczytaniu tego, mam dalsze obawy. Nie ma sposobu, aby wiedzieć, że pr jest procesem * my *. Na przykład, co jeśli mój program otworzył dwa okna notatnika? Zastanawiam się, czy istnieje lepszy sposób identyfikacji okna, które otworzyłem. –