我们编写了一个应用程序,它位于控制OpenVPN的托盘中,作为更大应用程序的扩展。
如果在命令行上运行openvpn.exe,可以按F4关闭它。我们需要从C#发送相同的按键,但您只能将字符串值发送到StandardInput。
我们被迫杀死OpenVpn以关闭它,这似乎在Vista上偶尔会导致BSOD ......
以下是我在MSDN上发布的帖子的链接,该帖子还介绍了该问题:MSDN Forums
有谁知道如何使用StandardInput向Process发送特殊击键?
或者可能是一种更干净地关闭OpenVPN的解决方法?
更新:
以下在传递给StandardInput.Write()时不起作用,F1键在此示例中:
我们已经正确地重定向输入/输出,因为我们可以成功地将用户名/密码传递给OpenVPN而没有任何问题。
更新2:在OpenVPN的一些命令行选项文档中找到了这个:
- 服务退出事件[0 | 1] 当在这样的环境中由另一个程序自动执行OpenVPN时,应该使用该环境,以便不能通过显示器或键盘与用户交互。通常,最终用户永远不需要显式使用此选项,因为当给定的OpenVPN配置作为服务运行时,OpenVPN服务包装器会自动添加该选项。 exit-event是Windows全局事件对象的名称,OpenVPN将持续监视此事件对象的状态,并在发出信号时退出。
第二个参数表示退出事件的初始状态,通常默认为0。
可以使用相同的exit-event参数同时执行多个OpenVPN进程。在任何情况下,控制过程都可以发出退出事件的信号,导致所有这样的OpenVPN进程退出。
我如何在C#中使用它? “退出事件”是否表示他们提到了Mutex?
答案 0 :(得分:3)
如果我按以下方式运行OpenVPN:
"openvpn.exe --config PathToMyConfig.ovpn --service MyEventName 0"
然后,以下C#代码导致OpenVPN干净地退出:
EventWaitHandle resetEvent = EventWaitHandle.OpenExisting("MyEventName");
resetEvent.Set();
道具咨询,他的评论帮助了很多。
答案 1 :(得分:1)
StandardInput.Write(ConsoleKey.F4);
显然你必须得到StandardIn才能完成这个过程。