3

バックグラウンドでプロセスを実行し、開こうとするウィンドウを非表示にするコマンド ラインまたは .NET メソッドはありますか?

すでに試しました:

 var process = new Process()
 {
      StartInfo = new ProcessStartInfo()
      {
          CreateNoWindow = true,
          WindowStyle = ProcessWindowStyle.Hidden,
          FileName = TheRealExecutableFileNameHere
      }
 }
 process.Start();

今のところ成功なし

4

14 に答える 14

15

私は自分のコードを見直しましたが、それはあなたのものとほぼ同じに見えます:

ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
   CreateNoWindow = true,
   WindowStyle = ProcessWindowStyle.Hidden,
   UseShellExecute = false,
   RedirectStandardOutput = true                                               
};

Process process = Process.Start(psi);

唯一の顕著な違い (フォーマットと選択した PSI コンストラクター以外) は、実行されたプロセスの結果を読み取る必要があるため、UseShellExecute と RedirectStandardOutput を使用したことです。

上記のコードは、XP と Vista で一貫して隠しプロセスを実行することがわかりました。ただし、非表示のプロセスが、デフォルトでは非表示になっていない別のプロセスを開始する可能性があることもわかりました。つまり、非表示のプロセス A を開始し、プロセス A がプロセス B を起動した場合、プロセス B の表示方法を制御することはできません。制御できないウィンドウが表示される場合があります。

これが少し役立つことを願っています。幸運を。

于 2009-07-12T14:49:41.897 に答える
6

Matlab エンジンを確認してください。

このアプローチがニーズに合っている場合は、CodeProject に関する興味深い記事もあります。

于 2009-07-20T22:49:55.160 に答える
3

これを達成するための純粋な.Netの方法を知りません。

次に、カーネルジョブ オブジェクトについて考えましたが、 UI 制限に同様のオプションが見つかりませんでした。

したがって、次の (まだ検証されていない) アイデアは、中断されたプロセスよりも作成し、Windows フックを作成して、 CallWndProcを監視し、WM_SHOW メッセージを除外することです。(その後、必ずプロセスを再開し、終了するまで別のスレッドで待機し、フックを削除します)

于 2009-07-21T07:16:27.840 に答える
2

これは回答済みですが、FindWindow と ShowWindow へのアンマネージ呼び出しでウィンドウを強制的に非表示にすることができます。

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

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

psi = new ProcessStartInfo(); // etc..
some_process = Process.Start(psi);
System.Threading.Thread.Sleep(50); // need give the window a chance to be created
IntPtr hWnd = FindWindow(null, "name of the window");
if (hWnd != IntPtr.Zero) ShowWindow(hWnd, 0); // 0 = SW_HIDE

むしろ不器用。

于 2009-07-27T16:34:54.503 に答える
2

まだ試していない場合は、.Net Framework でBackgroundWorker クラスを試してみてください。これは、実行時間の長いプロセスを別のスレッドで実行して、UI の妨げにならないようにするためのものです。見てください。

于 2009-07-24T10:21:03.433 に答える
1

ファイル名がWindows実行可能ファイルを指しているときにCreateNoWindow=falseがまったく何もしない場合、winformアプリのソースコードにアクセスできる場合は、デフォルトの表示を制御するコマンドライン引数を指定できる可能性があることに気付きました。フォームを作成し、Winformアプリの起動コードで次のようにします。

static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form1 form1 = new Form1();

        form1.Load += new EventHandler((s,o) =>
            {
              //check if the form should be shown based on command line arg
                if (args.Contains("dontShowWindow"))
                {
                    //hide it
                    form1.ShowInTaskbar = false;
                    form1.Visible = form1.ShowInTaskbar = false;
                }
            }
        );
        Application.Run(form1);
    }

コードを呼び出す際に、プロセス引数として「dontShowWindow」を指定できるようになりました。

 ProcessStartInfo info = new ProcessStartInfo
        {
            CreateNoWindow = false, 
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false, 
            FileName = @"C:\temp\testWinForm.exe",
            Arguments = "dontShowWindow"
        };
        Process.Start(info);

お役に立てれば

于 2009-07-27T06:13:50.417 に答える
1

アプリケーションを最小化して起動するが、必要に応じてユーザーと対話できるようにするか、何が起こってもユーザーとのすべてのアクセスを禁止するかによって異なります。

後者の場合、現在のユーザーとは異なるデスクトップ コンテキストでプロセスを実行できます。

たとえば、ログイン ダイアログと Vista UAC では、さまざまなデスクトップ コンテキストが使用されます。1 つのデスクトップ コンテキストで発生するすべてのことは、他のデスクトップ コンテキストから独立しています。

ただし、問題に対する大ハンマーのアプローチかもしれません。

于 2009-07-12T01:22:50.010 に答える
1

これを実現する非常に簡単な方法の 1 つは、サービス アカウントを作成し、Windows タスク スケジューラを介してサービス アカウント ユーザーのコンテキストで実行可能ファイルを実行することです。

この CodeProject を使用して、スケジュールされたタスクをセットアップできます。

http://www.codeproject.com/KB/cs/tsnewlib.aspx

C# を使用すると、ドメインまたはローカル マシンでプログラムによってサービス アカウントを非常に簡単に作成できます。

http://www.codeproject.com/KB/system/OSUserMangement.aspx http://support.microsoft.com/kb/306273

別のユーザーのコンテキストでスケジュールされたタスクとして実行されているプロセスは、そのユーザーがログインしていない限り、インタラクティブに表示されません。したがって、サービス アカウントを使用します。

于 2009-07-27T16:12:16.983 に答える
1
public Form1()
    {
        InitializeComponent();
        Form1 fm = new Form1();
        fm.ShowInTaskbar = false;
        fm.Visible = fm.ShowInTaskbar = false;
    }

よく働く !

于 2015-06-13T00:08:50.940 に答える
0

あなたが試してみたいと思うのは、新しいWindowsStationを作成することだと思います。msdnでそれらについて少し説明しているこの記事をチェックしてください。

http://msdn.microsoft.com/en-us/library/ms681928(VS.85).aspx

于 2009-07-24T21:10:09.593 に答える
0

Windows のサービスを作成できます。サービスが開こうとするウィンドウはすべてセッション 0 で実行されます。つまり、ユーザーはそれを見ることができません。ただし、これはすべてのウィンドウに当てはまるため、探しているものではない可能性があります。

于 2014-07-14T15:35:59.117 に答える
0

以下のコードは私にとってはうまくいきました:以前のプロセス(メモ帳)は、印刷のためにデスクトップ画面のメモ帳をフラッシュするために使用されていましたが、ユーザーの気を散らすため、以下のコードはバックグラウンドでメモ帳プロセスを非表示にします。

                System.Windows.Forms.PrintDialog printDialog = new PrintDialog();
                System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt");
                psi.Verb = "PRINT";

                //Process.Start(psi);
                //psi.CreateNoWindow = true;
                psi.UseShellExecute = false;
                //---------------------------------------------------

                psi.CreateNoWindow = false;
                psi.UseShellExecute = true;
                psi.FileName = Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt";
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                psi.Arguments =  @"%windir%\system32\notepad.exe"; 
                //Process.Start(psi);
                //------------------------------------------------------

                /////////////////////----------------------------------

                printProcess.StartInfo = psi;
                /////psi.CreateNoWindow = true;

                //psi.FileName = "Application.StartupPath" + "/PrintingDocketFile/PrintCustomerOrder.txt";
                //p.StartInfo.FileName = "Notepad.EXE";
                //p.StartInfo.Arguments = "/i /q \"" + installationPackages[i] + "\"";

                printProcess.Start();

                /////////////////////////-------------------------------
                while (!printProcess.HasExited) ;


                if (!printProcess.HasExited)
                {
                    printProcess.Close();
                }
于 2016-09-14T05:24:41.993 に答える
0

実行中にユーザーに見えないプロセスが必要だと思います。

以下を試して、これが必要かどうかを確認してください。

  1. 実行し続ける (そしてテストのために起動する) シンプルなコンソール アプリを作成します。
  2. プロジェクトを右クリック->プロパティ->アプリケーションタブ->出力タイプ->「コンソールアプリケーション」からWindowsアプリケーションに変更します。
  3. 同じアプリをもう一度起動します (これが必要かどうかを確認するため)。
  4. Windows タスク マネージャーでアプリを閉じます :)

タスク マネージャーにはプロセスが表示されているようですが、タスク バーには表示されません。Alt+TAB では、このプロセスを立ち上げることができません。

ただし、悪意のあるアプリを作成していないことを願っています:)

于 2009-07-12T05:24:14.740 に答える