我正在使用 C++ 和 Win32。
我希望我的上下文菜单和设置对话框显示在托盘图标附近。我想我需要图标的坐标来做到这一点。
Shell_NotifyIconGetRect 直到 Windows 7 才可用。
WM_CONTEXTMENU 从 Win2k 开始可用,但从 Vista 开始仅提供 wParam 中的坐标(以及在指定 NOTIFYICON_VERSION_4 时)。
我正在使用 C++ 和 Win32。
我希望我的上下文菜单和设置对话框显示在托盘图标附近。我想我需要图标的坐标来做到这一点。
Shell_NotifyIconGetRect 直到 Windows 7 才可用。
WM_CONTEXTMENU 从 Win2k 开始可用,但从 Vista 开始仅提供 wParam 中的坐标(以及在指定 NOTIFYICON_VERSION_4 时)。
解决此问题的正确方法是使用鼠标消息坐标,或使用GetMessagePos获取其他消息。
使用 GetCursorPos 检索点击坐标效果很好:
// Inside WndProc's switch(message)...
case WM_APP_NOTIFYCALLBACK:
switch (LOWORD(lParam))
{
case WM_CONTEXTMENU: // XP and later
{
POINT pt = {};
if( GetCursorPos(&pt) )
ShowContextMenu(hWnd, pt, iStatus);
}
break;
// ...
}
// ...
要显示菜单,您只需要 WM_CONTEXTMENU 或 WM_RBUTTONUP 传递给您的坐标(这些当然不是普通消息,而是由托盘生成的,因此您不必处理鼠标与键盘)
如果要在托盘附近显示吐司(自定义窗口),则使用 Shell_NotifyIconGetRect。在 < 7 上,您可以通过查找以 Shell_TrayWnd 作为父级的 TrayNotifyWnd 类来使用 findwindow 模拟它