我试图通过先将.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。请告诉我是否有人可以解决。谢谢
答案 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;
// ...