Я написал простую программу запуска, которая просматривает реальную программу, а затем выполняет ее. Это работает нормально, но есть одна проблема: Windows отображает курсор «указатель с песочными часами» примерно на несколько секунд. Этого не происходит, если я запускаю программу напрямую.
Я пробовал установить sinfo.dwFlags = STARTF_FORCEOFFFEEDBACK
, но это не помогло. Я предполагаю, что это потому, что моя программа каким-то образом должна отключать курсор, и программа, которую я запускаю, делает это нормально (создает правильное окно и т. Д.).
Это соответствующий код из моего приложения. У меня нет потоков или каких-либо других причудливых вещей (единственная цель программы - запустить другую программу и передать код выхода ее вызывающей стороне, если она о нем заботится):
STARTUPINFO sinfo = {0};
PROCESS_INFORMATION pinfo = {0};
if (!CreateProcess(program, buf, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)) {
Fail("Could not launch Vim");
}
if (WaitForSingleObject(pinfo.hProcess, INFINITE) == WAIT_FAILED) {
Fail("WaitForSingleObject");
}
2 ответа
По-видимому, Windows ожидает, что программа Windows будет обрабатывать сообщения, и не считает, что она полностью запущена до этого момента, поэтому показывает курсор запуска приложения.
Добавление следующего кода для обработки одного фиктивного сообщения решило проблему:
MSG msg;
PostMessage(NULL, WM_NULL, 0, 0);
GetMessage(&msg, NULL, 0, 0);
Ваша программа показывает значок песочных часов, потому что ваш поток пользовательского интерфейса зависает в результате остановки при вызове WaitForSingleObject. Помните, что WaitForSingleObject не возвращается, пока дочерний процесс не завершится. Вы можете заменить вызов ожидания на спящий режим и получить тот же эффект.
У вас есть несколько вариантов:
Вместо этого используйте MsgWaitForMultipleObjects объекта WaitForSingleObject. Это более формальный способ перекачки сообщений и одновременного ожидания вместо того, что вы предлагаете PostMessage / GetMessage в своем собственном ответе.
Выполните вызов Wait в другом потоке. Когда поток возвращается, он отправляет сообщение вашему потоку пользовательского интерфейса, чтобы указать, что это сделано.
В обоих вышеупомянутых случаях пользовательский интерфейс будет реагировать на щелчки и события ввода, пока дочерний процесс все еще выполняется. Вам нужно будет закодировать свой поток пользовательского интерфейса, чтобы обработать это соответствующим образом (если это оправдано).
Похожие вопросы
Новые вопросы
windows
Написание программного обеспечения, специфичного для операционной системы Microsoft Windows: API-интерфейсы, поведение и т. Д. ОБЩАЯ ПОДДЕРЖКА WINDOWS НЕВОЗМОЖНА. Вопросы поддержки можно задать на https://superuser.com