3

起動時にユーザー操作のない GUI ウィンドウを作成するアプリケーションを自動化しようとしていますが、実際のウィンドウを非表示にする方法がわかりません。

私は ProcessStartInfo を使ってみました:

Process.Start(new ProcessStartInfo {
    UseShellExecute = false,
    CreateNoWindow = true,
    WindowStyle = ProcessWindowStyle.Hidden,

    // other properties here
});

しかし、ウィンドウはまだ表示されます。

ウィンドウが存在するのをスピン待機してから非表示にすることも試みました。

while (process.MainWindowHandle == IntPtr.Zero) {}
ShowWindowAsync(process.MainWindowHandle, SW_HIDE);

残念ながら、これによりウィンドウが約 1/16 秒ほど点滅します。可能であれば回避したいと思います。

私の現在の考えは、 hookを作成する方向に沿っていますが、どのフックをつかむべきか、またそれが機能するかどうかもわかりません。

任意のヒント?

4

5 に答える 5

7

目的のプロセスウィンドウスタイル(実際には定数の1つにマップされてSW_いる)が他のアプリケーションのWinMain関数に渡されますが、それは失礼なアプリケーションが送信した値を無視しないという意味ではありません。

を使用して別の仮想デスクトップを作成しUser32.CreateDesktop、を使用してそれを実行できます。構造Kernel32.CreateProcessの一部として正しいデスクトップ名を渡すようにしてください。STARTINFO

于 2011-04-20T02:14:49.627 に答える
2

CreateNoWindowオプションは、コンソールモードアプリケーションにのみ適用されます。GUIアプリがメインウィンドウを作成するのを防ぐことはできません。最善の策はWindowStyleプロパティであり、HiddenまたはMinimizedに設定します。正常に動作するGUIアプリは、ShowWindow()の呼び出しでそれを使用します。しかし、この値を上書きまたは無視することは確かに珍しいことではありません。あなたの場合、オッズは良くありません。最小化するだけで、試してみることができます。

于 2011-04-20T02:32:35.373 に答える
0

WinFormプロジェクトのStartupObjectプロパティを設定してみませんか?フォームや実際のウィンドウを表示せずにプロセスを開始できます。

    static class Program {
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        // Application.Run(new Form1());
        // TODO: Start you process here?
    }

この助けを願っています、ありがとう。

于 2011-04-20T02:21:25.993 に答える
0

16秒を超えるために、フォーム領域全体のデスクトップのコンテンツでフォームペイントとブリットをオーバーライドできますか?

私は低レベルの勝利フォームに比較的慣れていないのですが、最近OnPaintを楽しんでいたので、これを考えました。

于 2011-04-20T02:40:06.717 に答える
0

UseShellExecute = true、WindowStyle = ProcessWindowStyle.Hiddenを指定してオプション1を試すか、UseShellExecuteを設定しないでください(デフォルトはtrue)

于 2011-04-20T02:15:35.787 に答える