我正在编写一个程序,以在新窗口中打开几个链接和路径,并将它们放置在特定屏幕上的特定位置。
直到现在我使用下面的代码:
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或应用程序需要花费一些时间。
有没有一种方法可以检查窗口是否打开? 因此,仅当窗口已经存在时程序才会继续执行。
答案 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的参数。