- 締切済み
C#でGUI・CUIの判断する仕方を教えて下さい
アプリケーションを開発しています 開発環境 Microsoft Visual Studio 2005 net framework 2.0 C# GUI(Windows アプリケーション)とCUI(コンソールアプリケーション)の アプリケーション開発しています 単体のアプリケーションは動作しています 2つのアプリケーションを1つの(EXE)で実行できるアプリケーションを 開発したいです 起動仕方は EXE にパラメータを付けたらCUIで起動して パラメータなしならばGUIで起動したいです プログラムで起動の仕方を判断できるのですか? できるなら参考資料(サンプルコート・ホームページなど)を教えて下さい 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- tsukasa-12r
- ベストアンサー率65% (358/549)
フォームアプリケーションに設定して、 [DllImport("Kernel32.dll")] static extern bool AllocConsole(); [DllImport("Kernel32.dll")] static extern bool FreeConsole(); if (args.Length == 0) { Application.Run(new Form1()); } else { AllocConsole(); Consol.WriteLine("HogeHoge"); FreeConsole(); } としてやる方法もありますが、この方法の場合、コマンドラインから実行したときにも別のコンソールが作成されます。 あと、親プロセスのコンソールにアタッチしてやることも可能です。 これもフォームアプリケーションでビルドしてください。 とりあえず、親が "cmd" かどうかで判定しています。 using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; namespace Test { static class Program { [DllImport("Kernel32.dll")] static extern bool AllocConsole(); [DllImport("Kernel32.dll")] static extern bool FreeConsole(); [DllImport("Kernel32.dll")] static extern bool AttachConsole( int processHandle ); private const int ATTACH_PARENT_PROCESS = -1; [STAThread] static void Main(string[] args) { if (args.Length == 0) { Application.Run(new Form1()); } else { Process p = Process.GetCurrentProcess(); PerformanceCounter pc = new PerformanceCounter("Process", "Creating Process Id", p.ProcessName); Process parent = Process.GetProcessById((int)pc.RawValue); if (parent.ProcessName.Equals("cmd")) { AttachConsole(ATTACH_PARENT_PROCESS); } else { AllocConsole(); } Console.WriteLine("HogeHoge"); if (!parent.ProcessName.Equals("cmd")) { FreeConsole(); } } } } }
- tsukasa-12r
- ベストアンサー率65% (358/549)
ちょっと無理やりっぽいですが、こんな感じで、どうでしょう。 using System.Diagnostics; using System.Windows.Forms; using System.Runtime.InteropServices; namespace Test { static class Program { [DllImport("User32.Dll")] static extern int ShowWindow( IntPtr hWnd, int nCmdShow ); private const int SW_HIDE = 0; static void Main(string[] args) { if (args.Length == 0) { Process p = Process.GetCurrentProcess(); IntPtr hwnd = p.MainWindowHandle; ShowWindow(hwnd, SW_HIDE); Application.Run(new Form1()); } else { Console.WriteLine("hogehoge"); } } } }
補足
tsukasa-12r さん回答ありがとうございました todo36 さんにお礼を記載していませんでしたので今回こちらで お礼させてもらいます コンソール アプリケーションで作りました こちらのサンプルで実行すると一瞬コマンドプロンプが表示されてしまいます コマンドプロンプを完全に消すことできませんか? 自分でもわかる範囲で実験してみましたけど完全に消すことできませんでした わかる方はテクニックを教えて下さい
- todo36
- ベストアンサー率58% (728/1234)
Windows アプリケーションプロジェクト Formを表示せずにConsoleを出すときは↓の後半参照 http://dobon.net/vb/dotnet/programing/consoleinout.html
補足
static void Main(string[] args) { System.IO.StreamWriter standard = new System.IO.StreamWriter(Console.OpenStandardOutput()); // 自動的にフラッシュされるようにする standard.AutoFlush = false; // Consoleの出力ストリームを変更する Console.SetOut(standard); if (args.Length == 0) { Application.Run(new Form1()); } else { for (int i = 0; i < args.Length; ++i) { Console.WriteLine("hogehoge-" + args[i]); } Console.WriteLine("hogehoge-end"); } } でプログラム作成しましたけど コマンドプロンプトで(WindowsApplication1.exe A B)しても何も表示しません いまいち使い方がわかりません
- tsukasa-12r
- ベストアンサー率65% (358/549)
まず、プロジェクトのプロパティーの「アプリケーション」タブの「出力の種類」を「コンソール アプリケーション」にします。 次に、Program.csを static void Main(string[] args) { if (args.Length == 0) { Application.Run(new Form1()); } else { Console.WriteLine("hogehoge"); } のような感じにすれば良いと思います。
補足
tsukasa-12r さん回答ありかとうございました 確かにこのようにすると希望の通りになります GUI アプリケーションの時はコマンドプロンプトの 画面も機動しています コマンドプロンプトを隠すことできますか? 宜しくお願いします
補足
tsukasa-12r さん回答ありがとうございました PerformanceCounter pc = new PerformanceCounter("Process", "Creating Process Id", p.ProcessName); この部分はちょっと時間がかかりますね コマンドプロンプトで実行すると最後のカレント表示がされません しかしリターンキーを押すとカレントが表示されます 何か実行中見たいて聞きなりましたのでネットで調べましたけどわかりませんでした 解決する方法はあるのですか? 宜しくお願いします