Я бы посоветовал не автоматизировать установку Windows, используя что-то вроде
blockquote>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; // ...
Нет способа напрямую распознать, определен ли typedef. Самый популярный обходной путь - проверить, определяет ли файл, который определяет typedef, также макрос.
Например, Тип "struct tm" определен в time.h. Если вы посмотрите на свою копию time.h, там будет макрос, определенный сверху. В версии VC2010 это «_INC_TIME», поэтому вы можете написать
#if !defined(_INC_TIME)
// Do whatever
#endif
Если интересующий вас тип определяет макрос, то вы можете проверить это.
Не знаю, как вы будете проверять typedef, но если есть макрос, который вы можете идентифицировать в файле с typedef, вы можете проверить операторы define с помощью #ifdef