C++ と Win32 を使用しています。
コンテキスト メニューと設定ダイアログをトレイ アイコンの近くに表示したい。そのためにはアイコンの座標が必要だと思います。
Shell_NotifyIconGetRect は Windows 7 まで利用できませんでした。
WM_CONTEXTMENU は Win2k 以降で使用できますが、Vista 以降 (および NOTIFYICON_VERSION_4 を指定する場合) の wParam でのみ座標を提供します。
C++ と Win32 を使用しています。
コンテキスト メニューと設定ダイアログをトレイ アイコンの近くに表示したい。そのためにはアイコンの座標が必要だと思います。
Shell_NotifyIconGetRect は Windows 7 まで利用できませんでした。
WM_CONTEXTMENU は Win2k 以降で使用できますが、Vista 以降 (および NOTIFYICON_VERSION_4 を指定する場合) の wParam でのみ座標を提供します。
これを解決する正しい方法は、マウス メッセージ座標を使用するか、他のメッセージに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 でエミュレートできます。