15

.NET で作成した 2 つのプログラム (.exe) があります。それらをマスターとワーカーと呼びます。マスターは 1 つ以上のワーカーを開始します。Worker はユーザーが操作することはありませんが、コマンドを受け取り、Master から受け取ったコマンドに基づいて WinForms コンポーネントを実行する WinForms アプリです。

Worker アプリを完全に非表示にして実行したい(もちろん、タスク マネージャーに表示されることを除く)。StartInfo.CreateNoWindowプロパティとStartInfo.WindowStyleプロパティを使用してこれを実現できると思っていましたが、フォームに Client.exe ウィンドウとコンポーネントがまだ表示されています。ただし、タスクバーには表示されません。

   Process process = new Process
      {
          EnableRaisingEvents = true,
          StartInfo =
              {
                  CreateNoWindow = true,
                  WindowStyle = ProcessWindowStyle.Hidden,
                  FileName = "Client.exe",
                  UseShellExecute = false,
                  ErrorDialog = false,
              }
      };

Client.exe を実行させて表示させないようにするにはどうすればよいですか? ㅤㅤㅤㅤㅤ</p>

4

4 に答える 4

10

CreateNoWindow/の使用法はWindowStyle、私のシステムでは notepad.exe で正常に動作するため (たとえば、非表示ですがバックグラウンドで実行されている)、おそらく WinForms アプリが行っていることです。いくつかのアイデア:

オプション 1: WinForms ワーカー プロセスを制御する場合は、オーバーライドControl.SetVisibleCoreしてフォームを常に非表示にすることができます。常に非表示にしたくない場合は、コマンドライン引数を渡すことができます。たとえば、非表示にすることができます/hide。例 (フォームのコード ビハインドが既に存在すると仮定):

public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }

    protected override void SetVisibleCore(bool value)
    {
        // You'd probably want to parse the command line.
        if (Environment.CommandLine.Contains("/hide"))
            base.SetVisibleCore(false);
        else
            base.SetVisibleCore(value);
    }
}

これにより、実行MyForm.exeするとフォームが見えるプロセスになります。実行MyForm.exe /hideすると、フォームが非表示のプロセスになります。マスター プロセスから引数を渡すことができる/hideので、アプリケーションを実行している通常のユーザーには引き続きそれが表示されます。

オプション 2: P/Invoke to を実行することで、アプリケーションの起動後にアプリケーションを非表示にすることができますShowWindow。詳細については、こちらをご覧ください。これには、非表示になる前にワーカー ウィンドウがちらつくことがあるという欠点があります。例:

class Program
{
    public static void Main(string[] args)
    {
        ProcessStartInfo psi = new ProcessStartInfo()
        {
            FileName = @"C:\windows\system32\notepad.exe",
        };

        Process process = Process.Start(psi);

        // Wait until the process has a main window handle.
        while (process.MainWindowHandle == IntPtr.Zero)
        {
            process.Refresh();
        }

        ShowWindow(process.MainWindowHandle, SW_HIDE);
    }

    const int SW_HIDE = 0;

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}
于 2010-06-10T04:36:58.370 に答える
7

問題は にあります。UseShellExecute = falseこれを に設定するtrueと、プロセスは非表示で開始されます。シェルを使用してプロセスを開始すると、アプリケーションを非表示にする方法が理解できます。プロセスを直接UseShellExecute = false開始するとプロセスが直接開始され、Chris Schmich が述べたように、クライアント アプリケーション内からウィンドウを非表示にする必要があります。デバッグまたはテストの目的でアプリケーションを手動で実行するオプションが必要な場合は、これがより望ましい場合があります。

于 2010-06-10T04:54:32.090 に答える