禁用或重定向对派生子流程的键盘输入
本文关键字:键盘 输入 派生 重定向 | 更新日期: 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
事件)