Получить дескриптор окна процесса установки Windows - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь автоматизировать установку Windows 10, сначала смонтировав файл .iso на диске. А затем с помощью 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}");
}

Но проблема в том, что окно настройки не принимает сигнал нажатия клавиши ВВОД в коде. Окно настройки начинается с этого кода. После этого ничего не происходит.

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

Я попытался использовать блокнот вместо setup.exe в коде, который принимает все клавиши ENTER. Подскажите пожалуйста, есть ли у кого решение. Спасибо

1 Ответ

1 голос
/ 14 марта 2019

Отказ от ответственности:

Я бы не советовал автоматизировать установку Windows, используя что-то вроде SendKeys, так как вы не можете гарантировать последовательное поведение и можете легко испортить ситуацию.Вы можете рассмотреть возможность поиска различных подходов , как это было предложено Ланом Кемпом в комментариях .Этот ответ только показывает, как правильно получить дескриптор окна настройки.Вы можете использовать его на свой страх и риск.

Обновление:

Очевидно, исполняемый файл установки 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;
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...