禁用或重定向对派生子流程的键盘输入

本文关键字:键盘 输入 派生 重定向 | 更新日期: 2023-09-27 18:29:00

我有Windows附带的计算器。我写了一个C#应用程序来启动它。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Process proc = new Process();
        proc.StartInfo.FileName = "Calc";
        proc.Start();
    }
}

我感兴趣的是是否可以抑制对子流程的键输入。例如,在计算器中,您只需按数字键即可输入。

有可能通过我的应用程序禁用这些密钥吗?或者,是否可以强制计算器的所有输入首先通过我的应用程序?

例如,假设我想让它在使用我的应用程序启动计算器时,按下计算器中的数字5不会有任何作用。

禁用或重定向对派生子流程的键盘输入

是的,您可以重定向标准输入流,这将防止用户直接向控制台窗口输入文本。您的程序可以写入Process.StandardInput(它是一个TextWriter)以向进程发送输入。

将您的点击处理程序更改为:

private void button1_Click(object sender, EventArgs e)
{
    Process proc = new Process();
    proc.StartInfo.FileName = "Calc";
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.RedirectStandardInput = true;
    proc.EnableRaisingEvents = true;
    _process.Exited += (sender1, e1) => process.Dispose();
    proc.Start();
}

三个注意事项:

  • 如果要实际写入其输入流,显然需要保留对Process实例的引用,或者至少保留对其StandardInput对象的引用
  • 您必须将UseShellExecute设置为false才能重定向到工作,这将禁用Process类的一些自动行为(例如,指定一个文件而不是可执行文件)。在您的特定场景中,这可能是问题,也可能不是问题
  • 最好在进程结束后处理Process对象。我在上面的例子中包括了几行来解决这个问题(启用引发事件,然后通过处理Process对象来处理Exited事件)