2011-04-08 9 views
0

私はC++とWin32を使用しています。通知(トレイ)アイコンのコンテキストメニューをWindows XPに配置するにはどうすればよいですか?

トレイアイコンの近くにコンテキストメニューと設定ダイアログが表示されます。私はそれをするためにアイコンの座標が必要だと思う。

Shell_NotifyIconGetRectは

WM_CONTEXTMENUはWin2kの中で開始可能ですが、唯一のビスタのようwParamの内の座標を提供(およびNOTIFYICON_VERSION_4を指定する場合)は、Windows 7までは利用できませんでした。

+1

理にかなっている、 – Erik

+0

オーケーあなたのメニューを配置するためにマウスメッセージ内の位置を使用してください。私は設定ダイアログでもそうすることができました。 –

+0

@Erik @Ianメニューがキーボードから呼び出されるとどうなりますか? –

答えて

1

は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; 
    // ... 
    } 
    // ... 
0

メニューを表示するには、WM_CONTEXTMENUまたはWM_RBUTTONUPによって渡されたコードが必要です(もちろんこれは通常のメッセージではありませんが、トレーによって生成されたものなので、マウスを扱う必要はありません)キーボード)

トレイの近くにトースト(カスタムウィンドウ)を表示する場合は、Shell_NotifyIconGetRectが使用されます。 < 7 findwindowで、Shell_TrayWndを親として持つTrayNotifyWndクラスを探すことでエミュレートできます

+0

これは動作しません。これらのメッセージには、LPARAMの座標は含まれていません。 –

+0

これについてのDavidの権利。これらはコールバックメッセージであり、通常のウィンドウメッセージではありません。 lParamにはメッセージが含まれています。 –

2

これを解決する正しい方法は、マウスメッセージの座標を使用するか、GetMessagePosを他のメッセージに使用することです。クリックを取得

+0

これは機能しました。私の質問の説明の一部が間違っています。 XPでは、WM_CONTEXTMENUコールバックメッセージを取得します。彼らはVistaと7のようにwParamに座標を持たないだけですが、WM_CONTEXTMENUハンドラのGetMessagePos()は完全に機能します。 –

+2

実際、GetCursorPosは機能します。 GetMessagePosは実際にはありません。コンテキストメニューを使用してダイアログを呼び出し、そのダイアログを閉じると、GetMessagePosが私がクリックして閉じた位置になります。 GetCursorPosはより良い振る舞いをしているようです。 –

+0

@Ian同意します。 GetCursorPosは魔法を実行するようだ! –

関連する問題