获取Windows安装过程的窗口句柄

时间:2019-03-14 04:35:33

标签: c# process

我试图通过先将.iso文件安装在驱动器上来自动执行Windows 10安装。然后使用c#通过以下代码开始Windows 10安装,该代码将密钥传递给安装应用程序

[DllImport("user32.dll")]
static extern int SetForegroundWindow(IntPtr point);
public static void Main(String[] args){
    Process p1 = Process.Start("h:\\setup.exe");
    IntPtr h = p1.MainWindowHandle;
    SetForegroundWindow(h);
    Thread.Sleep(30000);
    SendKeys.SendWait("{ENTER}");
    Thread.Sleep(1000);
    SendKeys.SendWait("{ENTER}");
    Thread.Sleep(1000);
    SendKeys.SendWait("{ENTER}");
}

但是问题是设置窗口没有接收代码中的ENTER键信号。设置窗口将从此代码开始。之后,什么也没发生。

Process p1 = Process.Start("h:\\setup.exe");

我尝试在使用所有ENTER键的代码中使用记事本代替setup.exe。请告诉我是否有人可以解决。谢谢

1 个答案:

答案 0 :(得分:1)

免责声明:

  

我建议不要使用类似的方法来自动执行Windows安装   SendKeys,因为您不能保证行为一致,并且可以   容易搞砸。您可以考虑寻找其他   接近as suggested by lan Kemp in the comments。这个答案   仅向您展示如何正确获取设置窗口的句柄。   您可能需要自担风险。

更新:

显然,Windows 10安装可执行文件(“ Setup.exe”)启动另一个名为“ SetupPrep.exe”的进程,该进程启动名为“ SetupHost.exe”的第三个进程(您所追求的)。因此,您可以做的是启动主进程,等待目标进程启动 并获得MainWindowHandle,然后执行其余代码:

Process p1 = Process.Start("H:\\setup.exe");

Process targetProcess;
do
{
    Thread.Sleep(500);
    targetProcess = Process.GetProcessesByName("SetupHost").FirstOrDefault();
} while (targetProcess == null || targetProcess.MainWindowHandle == IntPtr.Zero);

IntPtr h = targetProcess.MainWindowHandle;
// ...

这应该可以解决您的问题,但是,为此目的使用SendKeys不是一个明智的主意。请参阅上面的免责声明。

原始答案:

您是否确定h确实具有值(除IntPtr.Zero之外)?因为它可能没有实际的窗口句柄,因为您没有给进程足够的时间来启动和获取窗口句柄。

尝试这样的事情:

Process p1 = Process.Start("h:\\setup.exe");
while (p1.MainWindowHandle == IntPtr.Zero)
{
    Thread.Sleep(500);
}

IntPtr h = p1.MainWindowHandle;
// ...