« SHIFTキー抜きの「完全に削除」を作る。 | トップページ | VB.NETで、Console-Window Hybrid Applicationを作る。 »

2010年2月10日 (水)

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を作る。 »