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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

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

C++

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

Q&A

解決済

4回答

3245閲覧

(Win32API)ウインドウを生成せず、処理内容はバックグラウンドで行い、タスク常駐するアプリ

mercurian-teto

総合スコア75

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

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

C++

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

0グッド

2クリップ

投稿2018/04/10 11:47

編集2018/04/10 12:16

###環境
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; }

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

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

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

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

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

Zuishin

2018/04/10 11:52

C# タグを外してください。まったく関係ありません。Windows アプリはコンソールアプリやサービス以外基本的にウィンドウが必要です。ウィンドウを生成しないのではなく非表示にしてください。具体的な方法はほかの人に任せます。
mercurian-teto

2018/04/10 12:16

お騒がせしました。すいません訂正します。
guest

回答4

0

C# から Win32 API を呼び出すのに必要な定義については、ずばりそれらをまとめたサイトがこちらになります。C# と VB.NET の両方の定義が出てきます。
PInvoke.net

Visual Studio の add-in で統合環境から直接検索、ペーストなんかもできたります。

投稿2018/04/11 04:52

編集2018/04/11 04:53
tacsheaven

総合スコア13703

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

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

mercurian-teto

2018/04/19 08:29

C#でwinAPIでつかえるのは知りませんでした。 回答ありがとうございました。
guest

0

こんにちは。

Windows APIをC#から直接呼ぶこともできますよ。定義を自力で作る必要がありますし、中にはできないものもあるとは思いますが。
「C# windows api」で検索すると結構たくさん出てきます。
呼びたい関数名とC#で検索すると運が良ければ、その関数をC#から呼ぶための定義を公開してる記事が見つかることもあります。

投稿2018/04/11 04:22

Chironian

総合スコア23272

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

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

mercurian-teto

2018/04/19 08:27

C#でwinAPIを使えるのは知りませんでした。ありがとうございます。
guest

0

タスクトレイ に常駐する アプリケーション を作成するには
上記ではMFCを使ってますが、ほぼ生APIなので参考になると思います。
あるいは拡張ウインドウスタイルWS_EX_TOOLWINDOWShell_NotifyIcon関数で検索すると他にも参考になるページが見つかると思います。

投稿2018/04/10 12:01

can110

総合スコア38262

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

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

guest

0

ベストアンサー

まーよくやるのは、スプラッシュウィンドウ的なものをFormで作っておいて、常駐後表示を消すってことしますな。

なにも言わずに常駐するってのは、ワタクシ的にはキモチワルイと思いますねー

投稿2018/04/11 05:02

y_waiwai

総合スコア87749

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

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

mercurian-teto

2018/04/19 08:30

::ShowWindow(g_hWnd, SW_HIDE);を使用するのに行き着きました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問