2010-09-03 62 views
23

Tôi có thể bắt đầu quá trình (sử dụng C# Process.Start()) trong cùng một bảng điều khiển như chương trình gọi điện không? Bằng cách này, không có cửa sổ mới nào được tạo và đầu vào/đầu ra/lỗi chuẩn sẽ giống như ứng dụng bảng điều khiển gọi điện. Tôi đã thử thiết lập process.StartInfo.CreateNoWindow = true; nhưng quá trình vẫn bắt đầu trong một cửa sổ mới (và ngay lập tức đóng sau khi nó kết thúc).Bắt đầu quy trình trong cùng một bảng điều khiển

Trả lời

41

Bạn shouldn 't cần phải làm bất cứ điều gì khác hơn là thiết lập UseShellExecute = false, như là hành vi mặc định cho các chức năng Win32 CreateProcess là cho một ứng dụng giao diện điều khiển kế thừa giao diện điều khiển của cha mẹ của nó, trừ khi bạn chỉ định CREATE_NEW_CONSOLE cờ.

Tôi đã thử các chương trình sau đây:

private static void Main() 
{ 
    Console.WriteLine("Hello"); 

    var p = new Process(); 
    p.StartInfo = new ProcessStartInfo(@"c:\windows\system32\netstat.exe", "-n") 
     { 
      UseShellExecute = false 
     }; 

    p.Start(); 
    p.WaitForExit(); 

    Console.WriteLine("World"); 
    Console.ReadLine(); 
} 

và nó đã cho tôi kết quả này:

alt text

+0

Làm việc tuyệt vời, cảm ơn bạn. – ses011

8

Bạn có thể thử chuyển hướng đầu ra của quá trình này và sau đó in nó trên quá trình gọi console:

public class Program 
{ 
    static void Main() 
    { 
     var psi = new ProcessStartInfo 
     { 
      FileName = @"c:\windows\system32\netstat.exe", 
      Arguments = "-n", 
      RedirectStandardOutput = true, 
      UseShellExecute = false 
     }; 
     var process = Process.Start(psi); 
     while (!process.HasExited) 
     { 
      Thread.Sleep(100); 
     } 

     Console.WriteLine(process.StandardOutput.ReadToEnd()); 
    } 
} 

cách tiếp cận thay thế bằng cách sử dụng sự kiện Exited và xử lý chờ đợi:

static void Main() 
{ 
    using (Process p = new Process()) 
    { 
     p.StartInfo = new ProcessStartInfo 
     { 
      FileName = @"netstat.exe", 
      Arguments = "-n",           
      RedirectStandardOutput = true, 
      UseShellExecute = false      
     }; 
     p.EnableRaisingEvents = true; 
     using (ManualResetEvent mre = new ManualResetEvent(false)) 
     { 
      p.Exited += (s, e) => mre.Set(); 
      p.Start(); 
      mre.WaitOne(); 
     } 

     Console.WriteLine(p.StandardOutput.ReadToEnd()); 
    }   
} 
+0

Bất kỳ lý do cụ thể cho Looping với 'Thread.Sleep' thay vì lắng nghe cho' Process. Đã thoát và đồng bộ hóa với một xử lý chờ đợi thay thế? –

+0

Không, không có lý do cụ thể nào, chỉ là lười biếng, vui lòng chỉnh sửa câu trả lời của tôi để phản ánh đề xuất tuyệt vời này. –

+2

Hoặc bạn chỉ có thể sử dụng 'Process.WaitForExit' :) –

Các vấn đề liên quan