禁用或重定向对生成的子进程进行的键盘输入

时间:2014-11-04 17:23:41

标签: c# process

我有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不会做任何事情。

1 个答案:

答案 0 :(得分:0)

是的,您可以重定向标准输入流,这将阻止用户直接将文本输入控制台窗口。您的程序可以写入Process.StandardInputTextWriter)来向流程发送输入。

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

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对象。我在上面的示例中包含了几行来解决此问题(启用引发事件,然后通过部署Exited对象来处理Process事件)