プロが教えるわが家の防犯対策術!

アプリケーションを開発しています

開発環境
Microsoft Visual Studio 2005
net framework 2.0
C#

GUI(Windows アプリケーション)とCUI(コンソールアプリケーション)の
アプリケーション開発しています

単体のアプリケーションは動作しています

2つのアプリケーションを1つの(EXE)で実行できるアプリケーションを
開発したいです

起動仕方は
EXE にパラメータを付けたらCUIで起動して
パラメータなしならばGUIで起動したいです

プログラムで起動の仕方を判断できるのですか?
できるなら参考資料(サンプルコート・ホームページなど)を教えて下さい

宜しくお願いします。

A 回答 (4件)

まず、プロジェクトのプロパティーの「アプリケーション」タブの「出力の種類」を「コンソール アプリケーション」にします。


次に、Program.csを
static void Main(string[] args)
{
if (args.Length == 0)
{
Application.Run(new Form1());
}
else
{
Console.WriteLine("hogehoge");
}

のような感じにすれば良いと思います。

この回答への補足

tsukasa-12r さん回答ありかとうございました
確かにこのようにすると希望の通りになります

GUI アプリケーションの時はコマンドプロンプトの
画面も機動しています

コマンドプロンプトを隠すことできますか?

宜しくお願いします

補足日時:2011/04/15 19:19
    • good
    • 0

Windows アプリケーションプロジェクト



Formを表示せずにConsoleを出すときは↓の後半参照
http://dobon.net/vb/dotnet/programing/consoleino …

この回答への補足

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)しても何も表示しません

いまいち使い方がわかりません

補足日時:2011/04/15 21:38
    • good
    • 0

ちょっと無理やりっぽいですが、こんな感じで、どうでしょう。



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 さんにお礼を記載していませんでしたので今回こちらで
お礼させてもらいます

コンソール アプリケーションで作りました
こちらのサンプルで実行すると一瞬コマンドプロンプが表示されてしまいます

コマンドプロンプを完全に消すことできませんか?

自分でもわかる範囲で実験してみましたけど完全に消すことできませんでした

わかる方はテクニックを教えて下さい

補足日時:2011/04/16 07:31
    • good
    • 0

フォームアプリケーションに設定して、



[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 さん回答ありがとうございました

PerformanceCounter pc = new PerformanceCounter("Process", "Creating Process Id", p.ProcessName);
この部分はちょっと時間がかかりますね

コマンドプロンプトで実行すると最後のカレント表示がされません
しかしリターンキーを押すとカレントが表示されます
何か実行中見たいて聞きなりましたのでネットで調べましたけどわかりませんでした
解決する方法はあるのですか?

宜しくお願いします

補足日時:2011/04/16 20:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!