c - 多个窗口,单个托盘图标

标签 c windows winapi system-tray trayicon

我的目标是为我的应用程序的所有窗口使用一个图标。

经过一番阅读,我的理解是创建托盘图标是通过Shell_NotifyIcon()实现的。此函数获取一个 NOTIFYICONDATA 结构,其中包含一个 hWnd 字段。这个HWND是系统用来通知相应窗口托盘图标事件的。这些事件由使用 SetWindowLongPtr() 在窗口上设置的 WindowProc 回调处理。

因此我的问题是:

  • 单个图标如何通知我的应用程序的所有窗口单击鼠标左键?
  • 我可以使用不同的 NOTIFYICONDATA 结构多次 Shell_NotifyIcon() 吗?每次都有不同的 hWnd,但具有相同的图标?
  • 如果注册创建托盘图标的原始窗口被破坏怎么办?

创建一个隐藏的代理窗口是否是一个合适的解决方案?

一些背景:我的应用程序使用 C 调用 WinAPI(使用 js-ctypes),理想情况下应该适用于从 XP 开始的所有 Windows 版本。

最佳答案

您几乎在问题本身中回答了您自己的问题。最好的办法是创建一个隐藏窗口,只要您需要托盘图标,它就会一直存在。

您只需调用一次 Shell_NotifyIcon() 并使用 hWnd 引用此隐藏窗口,并让此窗口将消息发布到需要接收它们的各个窗口.

这也使您能够灵活地决定跳过向特定窗口发送消息,或者能够向每个窗口发送不同的消息,具体取决于您的特定应用程序的要求。

关于c - 多个窗口,单个托盘图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20093454/

相关文章:

c - 关于序列点和UB

c - 如何使用终端在 gcc 中启用 c99 模式

winapi - 在 C++ 中检测屏幕监视器电源状态变化

python - 编写通用脚本将数据从文件上传到数据库表

c - 如何释放C中的内存

windows - 将参数传递给 psql.exe

windows - 跨平台 Emacs 脚本

windows - ffmpeg如何在http协议(protocol)的windows中流式传输视频文件

c# - 如何使用 Win32 图标

c++ - 为什么在使用 ReadFile() 函数时会发生访问冲突?