我正在多次启动可执行文件
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
只返回第一个窗口。
我该怎么做?
答案 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);
}
}