如何检查是否启动以ShellExecute开始的进程?

时间:2018-06-25 11:08:33

标签: c#

我正在编写一个程序,以在新窗口中打开几个链接和路径,并将它们放置在特定屏幕上的特定位置。

直到现在我使用下面的代码:

class Program
{
    [DllImport("shell32.dll", EntryPoint = "ShellExecute")]
    public static extern long ShellExecute(int hwnd, string cmd, string file, string param1, string param2, int swmode);

    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);


    static void Main(string[] args)
    {
        IntPtr hwnd;

        ShellExecute(0, "open", "C:\\Program Files\\Mozilla Firefox\\firefox.exe", "www.example.de", "", 5);
        Thread.Sleep(5000);
        hwnd = GetForegroundWindow();
        SetWindowPos(hwnd, 0, 0, 0, 960, 1080, 0);

        //and so on for 8 applications on 4 screens...
    }
}

我使用了丑陋的sleep命令,因为这台旧计算机打开URL或应用程序需要花费一些时间。

有没有一种方法可以检查窗口是否打开? 因此,仅当窗口已经存在时程序才会继续执行。

1 个答案:

答案 0 :(得分:0)

您还可以查看设置特定浏览器的命令行开关,并跳过P / Invoke。这是Google Chrome浏览器的示例:

[STAThread]
static void Main()
{
    OpenUrl("www.example.com")
        .ContinueWith((lastTask) =>
            OpenUrl("www.example.de")
        ).ContinueWith((lastTask) =>
            OpenUrl("www.google.com")
        ).ContinueWith((lastTask) =>
            OpenUrl("www.stackoverflow.com")
        ).Wait();
}

private static Task OpenUrl(string url)
{
    return Task.Run(() =>
    {
        var chromePath = @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe";

        var startInfo = new ProcessStartInfo(chromePath, $"--user-data-dir=a --window-position=2400,400 --window-size=500,500 --app=\"http://{url}\"");
        var process = Process.Start(startInfo);

        process.WaitForInputIdle();
    });
}

在这里,我们将window-position和window-size设置为ProcessStartInfo的参数。