14

一連のウィンドウ(非表示ではなく、悪意のないもの)を閉じるための自動化を作成しようとしていますが、開いたときにフォーカスを奪われたくありません。問題は、各ウィンドウが開くと、フォーカスが奪われ、バックグラウンドで実行されている間は作業できなくなることです。さまざまなウィンドウを開くためにループで実行するコードは次のとおりです。

using (Process proc = new Process())
{
    proc.StartInfo.FileName = filename;
    proc.StartInfo.Arguments = arguments;
    proc.Start();

    Thread.Sleep(1000);

    if (!proc.HasExited)
    {
        proc.Kill();
    }
}

この自動化の実行中に他のことを実行できるように、フォーカスなしでこれらを開くにはどうすればよいですか?

補遺: 上記のコードを実行しているプログラムは、単純なコンソールアプリです。私が始めているプロセスはGUIアプリです。テスト/設計の目的で、私は現在iexplore.exe、さまざまな引数を使用してInternet Explorer()のインスタンスを繰り返し使用してこれを試みています。

これを実行し、これがバックグラウンドで実行されている間、他の無関係な作業を続行します。親アプリにもフォーカスを戻してほしくない。基本的に.exe、デスクに着いたときにこれを実行し、他のウィンドウに切り替えて他の作業を行います。元のプログラムとその子プロセスは、終了するまで無視します。

4

6 に答える 6

3

アプリにフォーカスを移動できます

    [DllImport("User32")]
    private static extern int SetForegroundWindow(IntPtr hwnd);
    [DllImportAttribute("User32.DLL")]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);


 Process.Start("");
        Thread.Sleep(100);
        var myWindowHandler = Process.GetCurrentProcess().MainWindowHandle;
        ShowWindow(myWindowHandler, 5);
        SetForegroundWindow(myWindowHandler);

SetForegroundWindow

ショーウィンドウ

于 2012-09-25T16:34:18.380 に答える
1

解決しました。

私が最終的に使用したソリューションは、属性やフォーカスの再割り当てを回避します。タスクは自動化されたスタンドアロンのものだったので、Windows タスク スケジューラを使用してアプリケーションを実行しました。何らかの理由で、「親」のコンソール ウィンドウにフォーカスがない限り、「子」の GUI ウィンドウは通常どおりに開きますが、フォーカスされていないため、アプリケーションの実行中に別のウィンドウで作業を続けることができます。

于 2012-10-15T08:06:30.430 に答える
0

SetForegroundWindowコンソール アプリでも同じことができます。

テスト済みコード:

簡単なクラスを作成します。

public class MyClass
{
    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    public void doProcess(string filename, string arguments){

        using (Process proc = new Process())
        {
            proc.StartInfo.FileName = filename;
            proc.StartInfo.Arguments = arguments;
            proc.Start();

            SetForegroundWindow(proc.MainWindowHandle);
        }
    }
}

次に、mainコンソール アプリのメソッドで:

class Program
{
    static void Main(string[] args)
    {
       MyClass mc = new MyClass();
       mc.doProcess("iexplore.exe", "http://www.stackoverflow.com");

       Console.ReadKey();
    }
}
于 2012-09-25T16:36:37.707 に答える
-2

Process.StartInfo.CreateNoWindow = trueとを組み合わせて使用​​しProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hiddenます。

Process.StartInfo.UseShellExecute = falseを使用して、StdIn/StdOut/StdErr をリダイレクトすることも価値があるかもしれません。

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspxを参照してください。

于 2012-09-25T16:31:43.660 に答える
-3

私はこれを試したことはありませんが、proc.StartInfo.WindowStyle = WindowStyle.Minimized を設定すればうまくいくと思います。

于 2012-09-25T16:25:47.393 に答える