Console-Window Hybrid Applicationを作る。
コンソールから起動されたらコンソールアプリで、GUIから起動されたらウィンドウアプリに変身する。
Window Application戦略(非推奨)
ウィンドウアプリで作って、コンソールから起動されたら変身する。
AttachConsole()できれば、コンソールから起動された。
GetStdHandle(STD_INPUT_HANDLE)
や
System.Console.In.GetType().ToString()
で区別する方法はリダイレクトに対応できないので非推奨。
ただし、コマンドプロンプトから起動したときに、終了を待ち合わせすることなくプロンプトに復帰して、バックグラウンド実行される。
アプリ | more
start /wait アプリ
で待ち合わせることもできるが面倒臭い。
なので、結局、この戦略は非推奨。
Console Application戦略(推奨)
コンソールアプリで作って、GUIから起動されたら変身する。
hwnd=GetConsoleWindow()
GetWindowThreadProcessID(hwnd,pid)
PIDが現PIDと一致すれば、GUIから起動された。
ShowWindow(hwnd,SW_HIDE)
System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle=0ならコンソールから起動された。
でも簡易判定できるが、GUIから非表示で起動されたときに誤判定される。
ShowWindow(hwnd,SW_HIDE)でなく、FreeConsole()するやり方も考えられるが、それなら、
FreeConsole()
AttachConsole()できれば、コンソールから起動された。
ただし、コンソールからstartで起動されたときに誤判定(?)される。
いずれにせよ、GUIから起動されたときに一瞬コンソールが表示される。
これを避けるには、ショートカットなら最小化にしておくとよいでしょう。
関連付けなどでは、HideRun.exeのような非表示ラッパを作ってやればよいでしょう。
HideRun.exe アプリ
« SHIFTキー抜きの「完全に削除」を作る。 | トップページ | VB.NETで、Console-Window Hybrid Applicationを作る。 »