ซ่อนหน้าต่างคอนโซลจากกระบวนการเริ่มต้น C #


103

ฉันกำลังพยายามสร้างกระบวนการบนเครื่องระยะไกลโดยใช้คลาส System.Diagnostics.Process ฉันสามารถสร้างกระบวนการ แต่ปัญหาคือการสร้างบริการใช้เวลานานและหน้าต่างคอนโซลจะปรากฏขึ้น สิ่งที่น่ารำคาญอีกอย่างคือหน้าต่างคอนโซลแสดงอยู่ด้านบนของฟอร์ม windows ของฉันและฉันไม่สามารถดำเนินการอื่นใดในแบบฟอร์มนั้นได้ ฉันได้ตั้งค่าคุณสมบัติทั้งหมดเช่นCreateNoWindow = true,

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

แต่ยังคงแสดงหน้าต่างคอนโซล แม้ว่าฉันจะเปลี่ยนเส้นทางเอาต์พุตและข้อผิดพลาดไปยังสตรีมแยก แต่ไม่มีโชค

มีวิธีอื่นในการซ่อนหน้าต่างคอนโซลหรือไม่? กรุณาช่วยฉันออกไป .

นี่คือส่วนของรหัสของฉันที่ฉันใช้ในการรันคำสั่ง 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();

ลองตั้งค่าแล้วproc.StartInfo.RedirectedStandardOutput = trueหรือยัง? ฉันได้รับสิ่งนี้เพื่อทำงานกับแอปพลิเคชัน Windows
poy

โซลูชันสุดท้ายที่มีตัวอย่างซอร์สโค้ดแบบเต็มกำลังทำงานอยู่หรือไม่
Kiquenet

ในแอปคอนโซล Windows เพียงแค่ตั้งค่า UseShellExecute - w / o redirection หรืออย่างอื่นก็ใช้ได้ผลสำหรับฉัน ดูที่นี่ .
พอล

เท่าที่หน้าต่างคอนโซลเปิดขึ้นและล็อกฟอร์มคุณควรเรียกใช้กระบวนการนี้เป็นงานหรือบนเธรดใหม่
Ryan Dooley

ทำไมคุณถึงตั้งค่าUseShellExecuteและCreateNoWindowสองครั้ง?
Mike Lowery

คำตอบ:


120

ฉันมีปัญหาคล้ายกันเมื่อพยายามเริ่มกระบวนการโดยไม่แสดงหน้าต่างคอนโซล ฉันทดสอบด้วยค่าคุณสมบัติที่แตกต่างกันหลาย ๆ ค่าจนพบค่าที่แสดงพฤติกรรมที่ฉันต้องการ

นี่คือหน้ารายละเอียดว่าเหตุใดจึงUseShellExecuteต้องตั้งค่าคุณสมบัติเป็นเท็จ
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

ภายใต้ส่วนหมายเหตุในหน้า:

ถ้าคุณสมบัติ UseShellExecute เป็นจริงหรือคุณสมบัติ UserName และรหัสผ่านไม่เป็นโมฆะค่าคุณสมบัติ CreateNoWindow จะถูกละเว้นและสร้างหน้าต่างใหม่

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
ต้องการเพิ่มรายละเอียดเพิ่มเติมหรือไม่? ทำไมงานนี้มากกว่าวิธี
aqua

2
เป็นเพราะเอาต์พุตมาตรฐานบังคับให้หน้าต่างมีอยู่หรือไม่?
Denise Skidmore

1
และเห็นได้ชัดว่าคุณไม่สามารถเปลี่ยนเส้นทางเอาต์พุตมาตรฐานโดยไม่ได้ตั้งค่าstartInfo.UseShellExecute = false;
Denise Skidmore

1
ฉันสงสัยว่าทำไมในคำตอบอื่น ๆ นี้พวกเขาใช้ UseShellExecute = true? stackoverflow.com/questions/2317767/c-process-start-hide
Denise Skidmore

10
ฉันจะไม่เข้าใจเลยว่าทำไมผู้คนถึงจับข้อยกเว้นได้พวกเขาก็แค่โยนอีกครั้งอยู่ดี
Blindy

54

ฉันโชคไม่ดีกับคำตอบนี้ด้วยกระบวนการ (Wix light.exe) โดยพื้นฐานแล้วจะออกไปทานอาหารกลางวันและไม่กลับบ้านตรงเวลาเพื่อทานอาหารเย็น อย่างไรก็ตามสิ่งต่อไปนี้ใช้ได้ผลดีสำหรับฉัน:

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

2
ทำงานให้ฉัน - ดีและเรียบง่าย!
เจค

2
นี่ควรเป็นคำตอบที่ยอมรับได้จริงๆ ใช้งานได้เหมือนมีเสน่ห์
Eternal21

2
CreateNoWindow = trueไม่ได้ผลสำหรับฉันสิ่งนี้ทำได้ :)
Stefan Monov

3
ใช้งานได้กับแอปพลิเคชันที่มีหน้าต่างเท่านั้นแอปพลิเคชันคอนโซลยังคงแสดงหน้าต่าง
Geograph

18

ควรใช้งานได้ลอง;


เพิ่มการอ้างอิงระบบ

using System.Diagnostics;

จากนั้นใช้รหัสนี้เพื่อเรียกใช้คำสั่งของคุณในหน้าต่างซ่อน CMD

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

11

สิ่งนี้ไม่แสดงหน้าต่าง:

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

...
cmd.Start();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.