Ẩn cửa sổ bảng điều khiển khỏi Process.Start C #


102

Tôi đang cố gắng tạo quy trình trên một máy từ xa bằng cách sử dụng lớp System.Diagnostics.Process. Tôi có thể tạo một quy trình. Nhưng vấn đề là, việc tạo một dịch vụ mất nhiều thời gian và cửa sổ giao diện điều khiển được hiển thị. Một điều khó chịu khác là cửa sổ giao diện điều khiển được hiển thị trên biểu mẫu cửa sổ của tôi và tôi không thể thực hiện bất kỳ thao tác nào khác trên biểu mẫu đó. Tôi đã đặt tất cả các thuộc tính như CreateNoWindow = true,

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

nhưng nó vẫn hiển thị cửa sổ giao diện điều khiển. thậm chí tôi đã chuyển hướng đầu ra và lỗi để tách luồng nhưng không may mắn.

Có cách nào khác để ẩn cửa sổ Console không? Hãy giúp tôi ra .

Đây là phần mã của tôi mà tôi đã sử dụng để thực hiện lệnh sc.

Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = "sc";
proc.StartInfo.Arguments = string.Format(@"\\SYS25 create MySvc binPath= C:\mysvc.exe");
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();

Bạn đã thử thiết lập proc.StartInfo.RedirectedStandardOutput = truechưa? Tôi đã nhận được điều này để làm việc với một Ứng dụng Windows.
poy

bất kỳ giải pháp cuối cùng với mẫu mã nguồn đầy đủ làm việc về nó?
Kiquenet

Trong ứng dụng bảng điều khiển Windows , chỉ cần thiết lập UseShellExecute - chuyển hướng w / o hoặc bất kỳ thứ gì khác - phù hợp với tôi. Xem tại đây .
Paul

Theo như việc mở giao diện điều khiển cửa sổ và khóa vào biểu mẫu, bạn nên chạy quá trình làm nhiệm vụ hoặc trên một chủ đề mới
Ryan Dooley

Tại sao bạn thiết lập UseShellExecuteCreateNoWindowhai lần?
Mike Lowery

Câu trả lời:


119

Tôi đã gặp sự cố tương tự khi cố gắng bắt đầu một quy trình mà không hiển thị cửa sổ bảng điều khiển. Tôi đã thử nghiệm với một số kết hợp giá trị thuộc tính khác nhau cho đến khi tôi tìm thấy một giá trị thể hiện hành vi mà tôi muốn.

Đây là trang trình bày chi tiết lý do tại sao thuộc UseShellExecutetính phải được đặt thành false.
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

Trong phần Nhận xét trên trang:

Nếu thuộc tính UseShellExecute là true hoặc thuộc tính UserName và Password không rỗng, giá trị thuộc tính CreateNoWindow sẽ bị bỏ qua và một cửa sổ mới được tạo.

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = fullPath;
startInfo.Arguments = args;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;

Process processTemp = new Process();
processTemp.StartInfo = startInfo;
processTemp.EnableRaisingEvents = true;
try
{
    processTemp.Start();
}
catch (Exception e)
{
    throw;
}

2
Bạn muốn thêm một số chi tiết bổ sung? Lý do tại sao điều này hoạt động hơn là như thế nào .
aqua

2
Có phải vì đầu ra tiêu chuẩn đang buộc cửa sổ tồn tại?
Denise Skidmore

1
Và rõ ràng bạn không thể chuyển hướng đầu ra tiêu chuẩn mà không cần thiết lậpstartInfo.UseShellExecute = false;
Denise Skidmore

1
Tôi tò mò tại sao, trong câu trả lời khác, họ sử dụng UseShellExecute = true? stackoverflow.com/questions/2317767/c-process-start-hide
Denise Skidmore

9
Tôi sẽ không bao giờ hiểu tại sao mọi người lại bắt gặp một ngoại lệ mà họ chỉ ném lại.
Blindy

54

Tôi đã gặp may mắn với câu trả lời này, với quá trình (Wix light.exe) về cơ bản là đi ăn trưa và không về nhà kịp bữa tối. Tuy nhiên, những điều sau đây hoạt động tốt đối với tôi:

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process

2
Làm việc cho tôi - tốt và đơn giản!
J c

2
Đây thực sự phải là câu trả lời được chấp nhận. Hoạt động như một sự quyến rũ.
Eternal 21

2
CreateNoWindow = truekhông làm việc cho tôi, điều này đã làm :)
Stefan Monov

3
Nó chỉ hoạt động cho ứng dụng có cửa sổ, ứng dụng bảng điều khiển vẫn hiển thị cửa sổ
Geograph

18

Điều này nên làm việc, hãy thử;


Thêm tham chiếu hệ thống.

using System.Diagnostics;

Sau đó, sử dụng mã này để chạy lệnh của bạn trong Cửa sổ CMD ẩn.

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.Arguments = "Enter your command here";
cmd.Start();

11

Điều này không hiển thị cửa sổ:

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.CreateNoWindow = true;

...
cmd.Start();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.