繁体   English   中英

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

[英]Get the window handle of the Windows setup 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");

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

免责声明:

我建议不要使用诸如SendKeys类的工具来自动执行Windows安装程序,因为您不能保证行为的一致性,并且很容易使事情搞砸。 您可以考虑寻找lan Kemp在评论中建议的不同方法。 该答案仅向您显示如何正确获取设置窗口的句柄。 您可能需要自行承担使用风险。

更新:

显然,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;
// ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM