1

我们编写了一个位于托盘中的应用程序,它控制 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# 中使用它?“退出事件”是否表明他们提到了互斥锁?

4

2 回答 2

3

如果我按以下方式运行 OpenVPN:

"openvpn.exe --config PathToMyConfig.ovpn --service MyEventName 0"

然后下面的 C# 代码会导致 OpenVPN 干净地退出:

EventWaitHandle resetEvent = EventWaitHandle.OpenExisting("MyEventName");

resetEvent.Set();

支持consultutah,他的评论有很大帮助。

于 2009-07-28T18:33:31.007 回答
1
StandardInput.Write(ConsoleKey.F4);

显然,您必须为该过程获得 StandardIn。

于 2009-07-28T16:29:02.613 回答