3

実行時にプロセスの可視性を切り替えたい、デフォルトで非表示になっている別のコンソール アプリのプロセスを介して起動する Windows フォーム アプリがありますが、管理者ユーザーがチェックボックスを介してこの状態を切り替え、コンソール アプリを表示できるようにしたいと考えています。彼らは選んだ。

私はこれを持っていますが、機能していません:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        ProcessWindowStyle state = cvarDataServiceProcess.StartInfo.WindowStyle;
        if (state == ProcessWindowStyle.Hidden)
            cvarDataServiceProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
        else if (state == ProcessWindowStyle.Normal)
            cvarDataServiceProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;            
    }
4

3 に答える 3

5

これには Win32 API を使用する必要があります。

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    ProcessWindowStyle state = ProcessWindowStyle.Normal;

    void toggle()
    {
        if (cvarDataServiceProcess.HasExited)
        {
            MessageBox.Show("terminated");
        }
        else
        {
            if (cvarDataServiceProcess.MainWindowHandle != IntPtr.Zero)
            {
                if (state == ProcessWindowStyle.Hidden)
                {
                    //normal
                    state = ProcessWindowStyle.Normal;
                    ShowWindow(cvarDataServiceProcess.MainWindowHandle, 1);
                }
                else if (state == ProcessWindowStyle.Normal)
                {
                    //hidden
                    state = ProcessWindowStyle.Hidden;
                    ShowWindow(cvarDataServiceProcess.MainWindowHandle, 0);
                }
            }
        }
    }

hiddenただし、ウィンドウが作成されず、メイン ウィンドウへのハンドルがゼロ (無効) になるため、プロセスが開始されると、これは機能しません。
そのため、プロセスを通常どおり開始し、その後非表示にすることができます。:)

于 2010-04-15T18:35:06.403 に答える
1

プロセスの開始後にProcess.StartInfo.WindowStyleを使用する代わりに、Process.ShowWindow()を使用してウィンドウスタイルを変更します。ただし、前述のように、プロセスを非表示で開始すると、プロセスウィンドウを表示できなくなります。私見ですが、これはMicrosoftが修正する必要のある非常に厄介なバグですが、残念ながら、ウィンドウを表示してから非表示にすることで回避できます。それほどきれいではなく、ユーザーインターフェイス(またはタスクバー)が少し点滅したままになりますが、少なくとも機能します。

于 2011-10-28T19:22:40.090 に答える