我们编写了一个位于托盘中的应用程序,它控制 OpenVPN 作为更大应用程序的扩展。
如果你在命令行运行 openvpn.exe,你可以按 F4 关闭它。我们需要从 C# 发送相同的按键,但您只能将字符串值发送到 StandardInput。
我们被迫杀死 OpenVpn 来关闭它,这似乎在 Vista 上时不时地导致 BSOD ......
这是我在 MSDN 上的帖子的链接,该帖子也描述了该问题:MSDN 论坛
有谁知道如何使用标准输入向进程发送特殊击键?
或者也许是更干净地关闭 OpenVPN 的解决方法?
更新:
以下内容在传递给 StandardInput.Write() 时不起作用,F1 键在此示例中:
- 控制台键.F1
- "\x70"(F1 的十六进制值)
- Convert.ToChar((int)ConsoleKey.F1)
我们已经正确地重定向了输入/输出,因为我们可以成功地将用户名/密码传递给 OpenVPN 没有问题。
更新 2:在 OpenVPN 的一些命令行选项文档中找到了这个:
--service exit-event [0|1] 应该在 OpenVPN 被另一个程序在这样的上下文中自动执行时使用,该上下文无法通过显示器或键盘与用户进行交互。通常,最终用户永远不需要显式使用此选项,因为当给定的 OpenVPN 配置作为服务运行时,它会由 OpenVPN 服务包装器自动添加。exit-event 是 Windows 全局事件对象的名称,OpenVPN 将持续监控此事件对象的状态,并在收到信号时退出。
第二个参数表示exit-event的初始状态,通常默认为0。
可以使用相同的退出事件参数同时执行多个 OpenVPN 进程。在任何情况下,控制进程都可以发出退出事件信号,导致所有此类 OpenVPN 进程退出。
我将如何在 C# 中使用它?“退出事件”是否表明他们提到了互斥锁?