質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2102閲覧

C++ タスクトレイアイコン右クリック時のメニュー出力位置について

Taffy

総合スコア33

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/06/23 12:46

開発環境は、Microsoft Visual Studio 2010 Expressを使用しています。
C/C++ コンソールアプリケーション (ネイティブC/C++です)を作成しています。
以下の処理を実装したいので、対策を教えてください。
1.アプリケーション起動中はタスクトレイにアイコンを表示する。
2.ユーザーがタスクトレイのアイコンを右クリックしたら「終了」メニューを表示する。
3.ユーザーが「終了」メニューをクリックしたら、アプリケーションを終了する。

現在、1~3まで実装しましたが、2.の終了メニューの表示で困っています。
ユーザーがタスクトレイ上のアイコンを右クリックした位置に「終了」メニューを表示したいのですが、
画面中央上部に「終了」メニューが現れてしまいます。

座標の取得方法がまずいのでしょうか?
原因と対応方法についてご教示いただきたく、よろしくお願いします。

C++

1// ウィンドウプロシージャ(コールバック関数) 2LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 3{ 4 POINT po; 5 static HMENU tmp, hmenuR, hmenuL; 6 7 switch (uMsg) 8 { 9 case WM_CREATE: 10 break; 11 // メニュー表示 12 case WM_CONTEXTMENU: 13 switch (lParam) 14 { 15 case WM_RBUTTONDOWN: 16 //SetForegroundWindow(g_hWnd); 17 // マウスカーソル座標取得 18 po.x = LOWORD(lParam); 19 po.y = HIWORD(lParam); 20 // スクリーン座標に変換 21 //ClientToScreen(g_hWnd, &po); 22 HMENU hMenu = CreatePopupMenu(); 23 24 MENUITEMINFO menuiteminfo; 25 menuiteminfo.cbSize = sizeof(menuiteminfo); 26 menuiteminfo.fMask = MIIM_STRING | MIIM_ID; 27 menuiteminfo.wID = 0; 28 menuiteminfo.dwTypeData = "終了"; 29 menuiteminfo.cch = 4; 30 31 InsertMenuItem(hMenu, 0, TRUE, &menuiteminfo); 32 33 TrackPopupMenuEx(hMenu, TPM_LEFTALIGN, po.x, po.y, g_hWnd, NULL); 34 DestroyMenu(hMenu); 35 break; 36 } 37 break; 38 case WM_DESTROY: 39 { 40 notifyicondata.hWnd = g_hWnd; 41 notifyicondata.uID = 0; 42 43 Shell_NotifyIcon(NIM_DELETE, &notifyicondata); 44 45 PostQuitMessage(0); 46 47 break; 48 } 49 case WM_COMMAND: 50 switch (LOWORD(wParam)) 51 { 52 case 0: 53 DestroyWindow(g_hWnd); 54 break; 55 } 56 break; 57 default: 58 return DefWindowProc(hwnd, uMsg, wParam, lParam); 59 } 60 return 0; 61}

また、タスクトレイアイコン出力処理は以下の通りにしています。

C++

1int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 2{ 3 MSG msg; 4 5 HWND hWnd; 6 WNDCLASS wcl; 7 8 wcl.hInstance = hInstance; 9 wcl.lpszClassName = "ConsoleWindowClass"; 10 wcl.lpfnWndProc = WindowProc; 11 wcl.style = 0; 12 wcl.hIcon = NULL; 13 wcl.hCursor = LoadCursor(NULL, IDC_ARROW); 14 wcl.lpszMenuName = NULL; 15 wcl.cbClsExtra = 0; 16 wcl.cbWndExtra = 0; 17 wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 18 19 if (!RegisterClass(&wcl)) return FALSE; 20 21 g_hInstance = hInstance; 22 23 hWnd = CreateWindowEx( WS_EX_LAYERED, 24 "ConsoleWindowClass", // LPCTSTR lpClassName 登録されているクラス名 25 "Windows", // LPCTSTR lpWindowName ウィンドウ名 26 WS_OVERLAPPEDWINDOW|WS_VISIBLE, // DWORD dwStyle ウィンドウスタイル 27 CW_USEDEFAULT, CW_USEDEFAULT, // int x, y ウィンドウの横,縦方向の位置 28 CW_USEDEFAULT, CW_USEDEFAULT, // int nWidth, nHeight ウィンドウの幅,高さ 29 NULL, // HWND hWndParent 親またはオーナーウィンドウのハンドル 30 NULL, // HMENU hMenu メニューハンドルまたは子識別子 31 hInstance, // HINSTANCE hInstance アプリケーションインスタンスのハンドル 32 NULL); // LPVOID lpParam ウィンドウ作成データ 33 if(!hWnd) return FALSE; 34 ShowWindow(hWnd,SW_HIDE); 35 36 g_hWnd = hWnd; 37 38 UpdateWindow(g_hWnd); 39 40 notifyicondata.cbSize = sizeof(notifyicondata); 41 notifyicondata.hWnd = g_hWnd; 42 notifyicondata.uID = 0; 43 notifyicondata.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_SHOWTIP; 44 notifyicondata.uCallbackMessage = WM_CONTEXTMENU; 45 notifyicondata.hIcon = ::LoadIcon(NULL, IDI_WINLOGO); 46 lstrcpy(notifyicondata.szTip, "XXXXX"); 47 48 Shell_NotifyIcon(NIM_ADD, &notifyicondata);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こちらの説明にある通り、uVersionにNOTIFYICON_VERSION_4を指定しない限りコールバックイベントにはカーソルの位置は入っていません。単純にクリックした位置にコンテキストメニューを出したいならGetCursorPosで位置を取得すればいいです。

投稿2019/06/23 14:37

toki_td

総合スコア2850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Taffy

2019/06/27 05:56

ありがとうございます。GetCursorPosで位置を取得し、メニューを出すことができるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問