コンソールアプリを裏に隠して、常駐アプリケーションのように利用したいと思います。
常駐アプリを作る場合にUIは必要ないので、コンソールアプリで作ると初期工数が少なくて済みます。なにせ、MS-DOS世代の爺には、コンソールの方が何かと作りやすいので・・・。
今回は、Windows11でどのような挙動をするのか調査してみました。
テスト環境
テストプログラム1
このプロジェクトにはアイコンが設定されています。こちらの記事を参考にしてください。
ここではカレントプロセスのウィンドウハンドルを利用し、HIDEしています。
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace MameMameConsole
{
internal class Program
{
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
const int SW_HIDE = 0;
const int SW_SHOW = 5;
static void Main(string[] args)
{
Console.Title = "MameMame";
var p = Process.GetCurrentProcess();
ShowWindow(p.MainWindowHandle, SW_HIDE);
Console.ReadKey();
}
}
}
動作結果1
ターミナルで起動
ターミナルで起動すると、普通に表に表示されてしまいました。
GetCurrentProcess()ではターミナルのウィンドウハンドルがとれていないようです。こちらの結果からも予想がついていましたが。
コンソールで起動
batから起動してコンソールで起動しました。(コンソールで起動する方法の詳細はこちらを参照してください。)
その結果、コンソールウィンドウは表示されません。また、タスクバーにもアイコンが表示されていません。
タスクマネージャで確認すると、”MameMameConsole(32ビット)”のプロセスが起動していることが確認できます。
テストプログラム2(出力の種類を「Windowsアプリケーション」にする)
コンソールを使わないで作成する方法がありました。プロジェクトの雛形は”コンソールアプリケーション”で作成しましたが、作成後に”Windowsアプリケーション“に変更してしまう方法です。
ソリューションの「プロパティ」を開きます。
「アプリケーション」の「出力の種類」を”コンソールアプリケーション”から”Windowsアプリケーション”に変更します。
これだけでOKです。
ただし、コンソールが無いので、Console.ReadKey()やConsole.WriteLine()などConsoleクラスは使えませんので、下記のようにコメントアウトし、とりあえず無限ループを組んであります。
動作結果2
”MameMameConsole.exe”を直接起動しました。
その結果、コンソールウィンドウは表示されません。また、タスクバーにもアイコンが表示されていません。
タスクマネージャで確認すると、”MameMameConsole(32ビット)”のプロセスが起動していることが確認できます。
こちらの方法の方がすっきりしていますね。