Первое, что должно быть ясно, это то, что вызовы Win32 API, которые связаны с окнами / сообщениями / фокусом и т. Д. не не зависят от времени.
Каждый поток имеет свою собственную подсистему окна / обмена сообщениями, здесь нет условий гонки.
То, что вы описываете, является чем-то другим. Вы фактически запускаете другой процесс (приложение), который работает одновременно с вашим.
Обратите внимание, что ShellExecute
является асинхронной функцией. Он возвращается сразу после создания процесса, и теперь ваше приложение и созданный вами процесс запускаются одновременно.
Теперь, поскольку только одно окно в системе может иметь фокус за раз - очень вероятно, что процесс, который вы создали, просто крадет у вас фокус.
Чтобы избежать этого - сначала нужно дождаться окончания работы этого процесса, и только затем восстановить фокус на вашем окне и продолжить работу.
Для этого вам нужно получить дескриптор созданного процесса и вызвать для него функцию ожидания Win32. ShellExecute
не возвращает вам дескриптор созданного процесса. Однако ShellExecuteEx
- делает.
Кстати, он также позволяет вам запустить процесс с инструкцией, чтобы он не отображал пользовательский интерфейс, если это то, что вам нужно.
Вы должны написать это так:
SHELLEXECUTEINFO sei;
memset(&sei, 0, sizeof(sei));
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpFile = L"notepad.exe";
sei.nShow = SW_SHOWNORMAL; // or SW_HIDE if you don't want to show it
if (ShellExecuteEx(&sei))
{
// wait for completion
WaitForSingleObject(sei.hProcess, INFINITE);
CloseHandle(sei.hProcess);
}
Это должно быть полезно
P.S. Конечно, вы должны закрыть дескриптор созданного процесса. То есть CloseHandle
должен вызываться после WaitForSingleObject
.