開発環境は、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, ¬ifyicondata); 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, ¬ifyicondata);
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/27 05:56