【问题标题】:Tray icon app to be closed from service托盘图标应用程序将从服务中关闭
【发布时间】:2018-08-01 13:34:01
【问题描述】:

所以标题是不言自明的。

我有一个用 C++ 编写的服务,它使用 CreateProcessAsUser 创建一个托盘图标,一切似乎都运行良好。

问题出现在停止服务时,我也想停止托盘图标应用程序,但这必须轻轻地完成,因为此应用程序可能会收到一些必须在退出之前保存到文件中的数据。

如果有用,可以使用 wxWidgets API,但现在所有的进程创建都是使用 Windows API 完成的,甚至托盘图标本身也是考虑到 wxWiidgets 以及服务。

欢迎任何建议!

【问题讨论】:

  • 您看过{适当}的示例吗?
  • @Igor 你对 {apppropiate} 样本是什么意思?
  • 可能是任务栏按钮之一。或者应用程序不是使用 wxWidgets {yet}?
  • @Igor 我一直在阅读它,但它并没有解决我的问题。如果不清楚,问题是我无法从服务中正常关闭托盘图标应用程序。

标签: c++ windows service wxwidgets tray


【解决方案1】:

托盘应用程序需要一种在应该正常退出时接收信号的方法。

如果托盘应用已经有一个窗口,您可以向它发送WM_CLOSEWM_QUIT 消息。但是,窗口消息不能通过会话边界发送。但是,如果您可以更改托盘应用程序,则可以使其接受一个可选的命令行参数,该参数仅将消息发送到应用程序的前一个实例,然后退出。然后服务可以在需要时使用该参数运行应用程序的新实例。或者,如果您无法更改应用程序,则只需运行您自己的服务 EXE 的第二个实例,或您编写的另一个帮助应用程序。

否则,如果托盘应用还没有窗口,但您可以更改应用,则添加隐藏窗口。或者更好的是,添加另一个 IPC 机制,例如通过CreateEvent() 应用程序可以等待的命名内核事件、管道或套接字等。然后服务可以直接向其发送信号。

否则,如果您无法更改托盘应用程序,并且如果它没有可以向其发送消息的窗口,那么您将无法使用TerminateProcess(),这很不优雅。

【讨论】:

  • 对,所以我一直在尝试使用 EnumWindows 枚举所有窗口。它似乎工作正常,因为它找到了所有窗口但没有找到托盘图标应用程序本身,或者至少它没有 PID。可能是原因被最小化了?
  • 最后解决方案似乎工作正常,这是一个与服务相关的问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多