2010-03-25 46 views
5

thể trùng lặp:
How do I send ctrl+c to a process in c#?C#: gửi ctrl + c đến bàn điều khiển chương trình bắt đầu với Process.Start()?

tôi không thể tìm ra cách để mô phỏng gửi Ctrl +C đến một chương trình bên ngoài. Khi tôi chạy chương trình theo cách thủ công thông qua CMD, khi tôi bấm Ctrl + c nó sẽ hủy bỏ và hỏi tôi xem tôi có muốn lưu trước khi nó tắt hoàn toàn không. Tôi đang cố gắng để mô phỏng này thông qua C# nhưng nó dường như không hoạt động.

Đây là những gì tôi đang làm bây giờ:

// Create new process object 
process = new Process(); 

// Setup event handlers 
process.EnableRaisingEvents = true; 
process.OutputDataReceived += OutputDataReceivedEvent; 
process.ErrorDataReceived += ErrorDataReceivedEvent; 
process.Exited += ProgramExitedEvent; 

// Setup start info 
ProcessStartInfo psi = new ProcessStartInfo 
{ 
    FileName = ExePath, 
    UseShellExecute = false, // Must be false to redirect IO 
    RedirectStandardOutput = false, 
    RedirectStandardError = false, 
    RedirectStandardInput = true, 
    Arguments = arguments 
}; 

process.StartInfo = psi; 

// Start the program 
process.Start(); 

process.StandardInput.Write("\x3"); // 0x3 is Ctrl+C according to ASCII table 

Chương trình không đáp ứng với điều này và chỉ tiếp tục. Là vấn đề mà Windows thực sự không gửi Ctrl +C cho luồng dữ liệu đầu vào khi thực hiện Ctrl +c trong giao diện điều khiển, nhưng thay vào đó sẽ gửi một "gián đoạn" để quá trình này? Tôi nghĩ rằng việc gửi "\ x3" vào luồng đầu vào là CHÍNH XÁC những gì Windows thực hiện khi một lần nhấn Ctrl + c trong bảng điều khiển. Liệu tôi có sai?

+0

Bảng điều khiển của bạn có thể đang bắt '^ C' và gửi tín hiệu về loại chương trình. Bạn cần mô phỏng hành vi đó; trên hệ thống Unixy, nó sẽ là 'SIGINT', tôi không biết nhiều về cửa sổ, tôi sợ. –

+0

Đây cũng là một trong những lý thuyết của tôi. Tôi không biết những gì CMD trên Windows được gửi đến chương trình của tôi (nếu nó không phải là ctrl + c). – johnrl

Trả lời

0

Câu hỏi này đã được trả lời vào một dịp mà tôi đã đăng câu trả lời chi tiết trên SO here.

+0

Đó là một thư viện tuyệt vời mà bạn có nhưng tôi thực sự cần một nền tảng độc lập hơn. Tôi cũng cần phải thực sự có thể gửi các khóa trực tiếp đến quá trình và không chỉ đến cửa sổ nền trước. – johnrl

+0

@Johnrl: Tôi không viết thư viện đó! :) được viết bởi người khác! :) nhưng tôi kết hợp nó vào một giàn khoan thử nghiệm như thể hiện trong liên kết để chứng minh rằng nó hoạt động và có thể được gửi trực tiếp đến quá trình ... không chỉ bất kỳ cửa sổ nền trước nào ... bằng cách xử lý cửa sổ, sử dụng nó gửi chìa khóa đến tay cầm đó! – t0mm13b

+0

Vấn đề là chương trình tôi bắt đầu không có cửa sổ vì tôi chuyển hướng tất cả đầu ra của nó vào chương trình của riêng tôi. Do đó việc gửi các khóa tới cửa sổ không hoạt động. – johnrl

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