查找具有相同标题的多个窗口

时间:2015-07-17 09:35:54

标签: c# winapi

我正在多次启动可执行文件

Process proc = new Process();
proc.StartInfo.FileName = path + "/BuiltGame.exe";
proc.Start();

Process proc1 = new Process();
proc1.StartInfo.FileName = path + "/BuiltGame.exe";
proc1.Start();

现在我想调整大小并移动衍生的窗口。

我目前正在使用MoveWindow和FindWindow

[DllImport("user32.dll", SetLastError = true)]
internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32.dll", SetLastError = true)]
internal static extern IntPtr FindWindow(string windowClass, string title);

最初我认为我可以使用衍生过程中的句柄

 MoveWindow(proc.Handle, 0, 0, 100, 100, true);

但它没有用,我尝试使用FindWindow

IntPtr Handle = FindWindow(null,"MyWindowTitle")

确实有效,FindWindow返回的句柄与Process.Handle

不同

之后我尝试使用

 MoveWindow(proc.MainWindowHandle, 0, 0, 100, 100, true);

MainWindowHandle只是0。

我现在遇到的问题是我想启动多个进程并从每个窗口获取正确的窗口句柄,但FindWindow只返回第一个窗口。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

调用EnumWindows枚举顶级窗口。对于每个此类窗口,请致电GetWindowText查找其文本,然后将其与目标值进行比较。

如果您要在特定流程中查找窗口,请使用GetWindowThreadProcessId

答案 1 :(得分:0)

在为游戏启动多个窗口时使用了此功能,但我还在等待几秒钟以使其启动并显示一个窗口。如果在窗口有机会初始化之前获取MainWindowHandle,则可能是一些问题。这样一来,我就可以在继续执行下一个流程的过程中设置每个职位,然后再继续下一个

            // Launch each process
            using (Process myProcess = new Process())
            {
                myProcess.StartInfo.FileName = Folder + "\\executable.exe";
                myProcess.StartInfo.WorkingDirectory = Folder;
                myProcess.StartInfo.UseShellExecute = false;
                myProcess.StartInfo.RedirectStandardInput = true;
                
                myProcess.Start();

                // Wait for process to start up, default 2000ms set elsewhere
                await Task.Delay(LaunchDelayTime);

                // If found, position it.
                if (myProcess.MainWindowHandle != IntPtr.Zero)
                {
                    // Move to WindowLeft x WindowTop, set elsewhere
                    SetWindowPos(myProcess.MainWindowHandle, IntPtr.Zero, (int)WindowLeft, (int)WindowTop, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
                }
            }