###環境
windows 10 pro
visual studio 2017
###質問
C#にあるようなWPF常駐タスクのアプリをwindowsAPIで実現する
C#のWPFの常駐タスクは
①タスクバーにアイコンが表示して、
②左クリックするとポップアップメニューが開かれたり、
③ウインドウを生成せず、バックグラウンドで処理内容を実行する
CのwinAPIの常駐アプリだと、①や②は自分でもできたのですが、
ウインドウを生成せず、バックグラウンドで処理(windowsを出さずに処理)
の実装方法がわかりません。
「windows API バックグラウンド」で検索してもいい情報が見当たりません。
また、C#のWPFアプリのようなものを目指しているので、windowsサービスではありません。
下にあるのが、windowsAPIの常駐タスクアプリです。
どういった実相を加えればよろしでしょうか。
また、windows APIで行いたい理由は
windows APIでシャットダウンを抑制するコマンドがあるからです。
これをバックグランで常駐して実行したいです。
サンプル #include <Windows.h> #include <tchar.h> #define WM_TASKTRAY (WM_USER+1) #define ID_TASKTRAY 0 HWND g_hWnd; LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_TASKTRAY: if (wParam == ID_TASKTRAY) { switch (lParam) { break; case WM_RBUTTONUP: /* 右ボタンが離された処理 */ MessageBox(NULL, _T("こんにちは"), _T("Sample02"), NULL); return 1; break; default: /* 上記以外の処理 */ break; } } break; case WM_DESTROY: //!< ウインドウを閉じる ::PostQuitMessage(0); //!< WM_QUITを送る return ::DefWindowProc(hWnd, msg, wParam, lParam); default: return ::DefWindowProc(hWnd, msg, wParam, lParam); } return ::DefWindowProc(hWnd, msg, wParam, lParam); } BOOL Init(HINSTANCE hInstance) { // ウインドウ生成 WNDCLASS wc; //!< ウインドウクラス // ウインドウクラスの登録 wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = static_cast<WNDPROC>(WndProc); //!< メッセージを受け取るウインドウ関数 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; //!< アイコン登録 wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); //!< カーソル登録 wc.hbrBackground = static_cast<HBRUSH>(::GetStockObject(WHITE_BRUSH)); wc.lpszMenuName = NULL; //!< メニューの登録 wc.lpszClassName = L"常駐"; // ウインドウクラスの登録 if (!::RegisterClass(&wc)) return EXIT_FAILURE; // ウインドウを作成 g_hWnd = ::CreateWindow(L"常駐", //!< クラス名 L"常駐", //!< タイトル名 WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, //!< スタイル 0, //!< X座標 0, //!< Y座標 100, //!< 横幅 100, //!< 高さ NULL, //!< 親ウインドウのハンドル NULL, //!< メニューハンドル hInstance, //!< インスタンスハンドル NULL); //!< lParam // ウインドウの作成 if (!g_hWnd) return EXIT_FAILURE; // ウインドウの表示状態の設定 ::ShowWindow(g_hWnd, SW_SHOW); // ウインドウの更新 ::UpdateWindow(g_hWnd); // http://yokohama.cool.ne.jp/chokuto/urawaza/struct/NOTIFYICONDATA.html // http://yokohama.cool.ne.jp/chokuto/urawaza/trayicon.html // http://www31.ocn.ne.jp/~yoshio2/vcmemo17-1.html NOTIFYICONDATA nif; // タスクトレイに登録 nif.cbSize = sizeof(NOTIFYICONDATA); nif.hIcon = LoadIcon(NULL, IDI_APPLICATION); nif.hWnd = g_hWnd; nif.uCallbackMessage = WM_TASKTRAY; nif.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nif.uID = ID_TASKTRAY; ::wcscpy_s(nif.szTip, 128, L"常駐"); Shell_NotifyIcon(NIM_ADD, &nif); return EXIT_SUCCESS; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; if (Init(hInstance) == EXIT_FAILURE) return EXIT_FAILURE; while (::GetMessage(&msg, NULL, 0, 0)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } return EXIT_SUCCESS; }
回答4件
あなたの回答
tips
プレビュー