2017年11月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
無料ブログはココログ

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