2010-08-09 80 views
15

Trước khi bạn nói câu hỏi trùng lặp của nó, hãy để tôi giải thích (vì tôi đã đọc tất cả các chủ đề tương tự).Ẩn Cửa sổ Lệnh trong C# Ứng dụng

Ứng dụng của tôi có cả các thiết lập này:

procStartInfo.CreateNoWindow = true; 
    procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

và cũng là có WindowsApplication như các loại đầu ra.

Cửa sổ màu đen STILL xuất hiện khi tôi gọi một lệnh dòng lệnh. Tôi có thể làm gì khác để che giấu cửa sổ không? Nó không xảy ra cho tất cả các lệnh, XCOPY là một tình huống mà nó cửa sổ đen hiện lên. Điều này chỉ xảy ra mặc dù khi đích đến, tôi XCOPYing cũng đã chứa tệp và nó nhắc tôi nếu tôi muốn thay thế nó. Ngay cả khi tôi vượt qua/Y nó vẫn sẽ nhấp nháy một thời gian ngắn.

Tôi đang mở để sử dụng VBScript nếu điều đó sẽ giúp ích, nhưng có ý tưởng nào khác không?

Các khách hàng sẽ gọi thực thi của tôi và sau đó vượt qua trong một ví dụ lệnh dòng lệnh:

C:\MyProgram.exe start XCOPY c:\Test.txt c:\ProgramFiles\

Dưới đây là đoạn code đầy đủ của ứng dụng:

class Program 
{ 
    static void Main(string[] args) 
    {  
      string command = GetCommandLineArugments(args); 

      // /c tells cmd that we want it to execute the command that follows and then exit. 
      System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c " + command); 

      procStartInfo.RedirectStandardOutput = true; 
      procStartInfo.UseShellExecute = false; 

      // Do not create the black window. 
      procStartInfo.CreateNoWindow = true; 
      procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

      System.Diagnostics.Process process = new System.Diagnostics.Process(); 
      process.StartInfo = procStartInfo; 
      process.Start(); 

     } 

    private static string GetCommandLineArugments(string[] args) 
    { 
     string retVal = string.Empty; 

     foreach (string arg in args) 
      retVal += " " + arg; 


     return retVal; 
    } 
} 
+0

Bạn có thể đăng phần còn lại của 'Process' /' ProcessStartInfo' c ode? –

+3

@fletcher: Nó được nêu trong câu hỏi rằng loại đầu ra là Ứng dụng Windows và không phải bàn điều khiển. Tôi đã thử nghiệm nó với loại đầu ra thiết lập để ứng dụng Windows và nó hoạt động tốt. @snow: Tôi sẽ kiểm tra lại thiết lập OutputType của bạn. – nukefusion

+0

@fletcher Đó thực sự là một vấn đề! Tôi muốn cho cửa sổ không hiển thị ở tất cả! – mint

Trả lời

9

Vấn đề là bạn đang sử dụng cmd.exe. Chỉ cửa sổ bảng điều khiển của nó sẽ bị ẩn, không phải cửa sổ bảng điều khiển cho quá trình bạn yêu cầu bắt đầu. Có rất ít điểm trong việc sử dụng cmd.exe, trừ khi bạn đang cố gắng thực hiện một số lệnh mà nó thực hiện chính nó. Giống như COPY.

Bạn vẫn có thể chặn cửa sổ nếu bạn cần cmd.exe, bạn sẽ phải sử dụng tùy chọn/B cho Bắt đầu. Nhập bắt đầu /? tại dấu nhắc lệnh để xem các tùy chọn. Không phải là nó giúp, bạn không thể sử dụng BẮT ĐẦU BẢN SAO.

Có một dấu ngoặc đơn cụ thể trong xcopy.exe có thể khiến bạn bị tắt. Nó thực hiện không thực thi nếu bạn cũng không chuyển hướng đầu vào. Nó chỉ không chạy mà không cần chẩn đoán.

+0

/B đã làm việc cho lệnh xcopy, có thể là tất cả những gì chúng ta cần phải trung thực – mint

4

tôi thấy rằng bạn đang gọi cmd và sau đó truyền lệnh dưới dạng tham số. Thay vào đó, hãy gọi trực tiếp lệnh

ví dụ:

System.Diagnostics.ProcessStartInfo procStartInfo = new System.DiagnosticsProcessStartInfo("xcopy", "<sourcedir> <destdir> <other parameters>"); 

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
+0

Tôi có lẽ đã nói điều này trong câu hỏi, nhưng khách hàng sẽ chuyển bất kỳ lệnh dòng lệnh nào mà anh ấy muốn vào chương trình của tôi, – mint

+1

@Snow, bạn vẫn có thể làm những gì anh ta nói, 'ProcessStartInfo procStartInfo = new ProcessStartInfo (Arg [0], String.Join (" ", Arg.Skip (1) .ToArray());' –

+0

@snow xcopy chỉ là Ví dụ: –

4

Bạn có thể thử thêm

process.StartInfo.UseShellExecute = false; 

đến quá trình của bạn

+2

Chỉ cần làm rõ câu trả lời.Bạn cần 'process.StartInfo.UseShellExecute = false; 'và' process.StartInfo.CreateNoWindow = false; 'Hai số đó cùng nhau sẽ ẩn cửa sổ quá trình –

+1

@ Rémi: bạn cần' process.StartInfo.CreateNoWindow = true; ' – Sjoerd222888

+0

Tôi gặp lỗi" Hệ thống không thể tìm thấy tập tin được chỉ định. "Điều này mặc dù tôi đã thêm lệnh tùy chỉnh vào biến PATH của hệ thống. – Najeeb

0

tôi đã có một công việc tương tự - Có thể ẩn cửa sổ sau khi tạo thông qua một cuộc gọi API. (Trong trường hợp của bạn, bạn có thể cần một chuỗi trợ giúp.)

[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

Nếu bạn biết tay cầm của cửa sổ mới, bạn có thể gọi

ShowWindow(hWnd, 0); 

0 ẩn cửa sổ, 1 cho thấy các cửa sổ

Để có được xử lý của cửa sổ có một cái nhìn tại:

pinvoke.net enumwindows(user32)

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