How to send keys instead of characters to a process?
.net, c#, keyboard, process, streamwriter
Solution
You are mixing input streams with control signals. A console process has a default input stream which you can control with the StandardInput, as you already know. But Ctrl-C and Ctrl-Break are not characters sent to the process through this stream, but instead they are instead control signals that the process receives using the registered signal handlers, see CTRL+C and CTRL+BREAK Signals:
By default, when a console window has the keyboard focus, CTRL+C or CTRL+BREAK is treated as a signal (SIGINT or SIGBREAK) and not as keyboard input.
To send fake signals to a process you can use `GenerateConsoleCtrlEvent` and send either `CTRL_C_EVENT` or `CTRL_BREAK_EVENT`. This API has no .Net equivalent, so you have to PInvoke it.
To use it from .NET you simply need to include the function definition:
const int CTRL_C_EVENT = 0;
const int CTRL_BREAK_EVENT = 1;
[DllImport("kernel32.dll")]
static extern bool GenerateConsoleCtrlEvent(
uint dwCtrlEvent,
uint dwProcessGroupId);
Problem
System.Diagnostics.Process exposes a StreamWriter named StandardInput, which accepts only characters as far as I know. But I need to send keystrokes as well, and some keystrokes don't map well to characters. What should I do?