#include // 参考にしたサイト //http://www31.ocn.ne.jp/~yoshio2/vcmemo17-1.html //http://www.sm.rim.or.jp/~shishido/task.html //http://www.sm.rim.or.jp/~shishido/src/fmenu.txt //http://web.kyoto-inet.or.jp/people/ysskondo/from29/chap34.html //検索"アクセラレータ HACCEL" //http://www7a.biglobe.ne.jp/~lshen/EternalWindows/WinBase/Menu/Menu07.html HWND hwMain; int g_iCmdShow; bool g_Play = false; LRESULT CALLBACK WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) { static HICON hIcon; static NOTIFYICONDATAA Notify; static HMENU hMenu,hMenuP; POINT pt; char cPupMsg[] = "やらないか?"; static bool flag = true; // ウィンドウが表示されているかどうか switch (iMsg) { case WM_CREATE: // ウインドウ生成時 // タスクトレイに追加するアイコンのハンドルを取得 hIcon = LoadIcon(NULL,IDI_APPLICATION); // NOTIFYICONDATA設定 Notify.cbSize = sizeof(NOTIFYICONDATA); Notify.hWnd = hwnd; Notify.uID = 0; Notify.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; Notify.uCallbackMessage = WM_USER; Notify.hIcon = hIcon; strcpy_s( Notify.szTip, sizeof(Notify.szTip), cPupMsg ); // タスクトレイにアイコン追加 Shell_NotifyIconA( NIM_ADD, &Notify ); return 0; case WM_USER: // タスクトレイのアイコンメッセージ switch( lParam ) { case WM_LBUTTONDOWN: // 右ボタンクリック break; case WM_RBUTTONDOWN: // 右ボタンクリック // ポップアップメニューを開く前にメインウィンドウをアクティブにします。 // これを省略すると他のウィンドウにフォーカスが移ってもポップアップメニューが // 消えなくなってしまいます。 SetActiveWindow(hwnd); hMenu = CreateMenu(); // トップレベルメニュー hMenuP = CreateMenu(); // フローティングメニュー // フローティングメニュー作成 if( flag ) { AppendMenuA( hMenuP, MF_CHECKED | MF_STRING, 1, "ウィンドウを表示" ); } else { AppendMenuA( hMenuP, MF_STRING, 1, "ウィンドウを表示" ); } AppendMenuA( hMenuP, MF_STRING, NULL, "再生" ); AppendMenuA( hMenuP, MF_STRING, NULL, "停止"); if( flag ) { AppendMenuA( hMenuP, MF_CHECKED | MF_STRING,NULL, "タイマーオン" ); } else { AppendMenuA( hMenuP, MF_UNCHECKED | MF_STRING,NULL, "タイマーオン" ); } AppendMenuA(hMenuP,MF_STRING, 2,"終了"); // フローティングメニューをメニューに登録 AppendMenuA( hMenu, MF_POPUP, (UINT)hMenuP, NULL ); GetCursorPos( &pt ); // カーソル位置にメニューを出す TrackPopupMenu( hMenuP, 0, pt.x, pt.y, 0, hwnd, NULL ); break; } return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case 1: // Messageメニュー if( flag ) { flag = false; ShowWindow(hwMain,SW_HIDE); // ウインドウを非表示 UpdateWindow (hwMain); // 再描画 } else { flag = true; ShowWindow(hwMain,g_iCmdShow); // ウインドウを表示 UpdateWindow (hwMain); // 再描画 } break; case 2: // Exitメニュー DestroyWindow(hwMain); break; } return 0; case WM_DESTROY: // ウインドウ破棄時 // タスクトレイからアイコン削除 Shell_NotifyIconA( NIM_DELETE, &Notify ); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,iMsg,wParam,lParam); } int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) { g_iCmdShow = iCmdShow; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = L"CWindow"; RegisterClass(&wndclass); hwMain = CreateWindowA( "CWindow", "タスクトレイへのアイコン追加", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 560, 480, NULL, NULL, hInstance, NULL ); ShowWindow(hwMain,g_iCmdShow); // ウインドウを表示 UpdateWindow (hwMain); // 描画 while(GetMessage(&msg,NULL,0,0)) // メッセージループ { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; }