Я написал простую программу запуска, которая просматривает реальную программу, а затем выполняет ее. Это работает нормально, но есть одна проблема: 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");
}
4
ThiefMaster 27 Дек 2013 в 06:03

2 ответа

Лучший ответ

По-видимому, Windows ожидает, что программа Windows будет обрабатывать сообщения, и не считает, что она полностью запущена до этого момента, поэтому показывает курсор запуска приложения.

Добавление следующего кода для обработки одного фиктивного сообщения решило проблему:

MSG msg;
PostMessage(NULL, WM_NULL, 0, 0);
GetMessage(&msg, NULL, 0, 0);
4
ThiefMaster 27 Дек 2013 в 02:07

Ваша программа показывает значок песочных часов, потому что ваш поток пользовательского интерфейса зависает в результате остановки при вызове WaitForSingleObject. Помните, что WaitForSingleObject не возвращается, пока дочерний процесс не завершится. Вы можете заменить вызов ожидания на спящий режим и получить тот же эффект.

У вас есть несколько вариантов:

  1. Вместо этого используйте MsgWaitForMultipleObjects объекта WaitForSingleObject. Это более формальный способ перекачки сообщений и одновременного ожидания вместо того, что вы предлагаете PostMessage / GetMessage в своем собственном ответе.

  2. Выполните вызов Wait в другом потоке. Когда поток возвращается, он отправляет сообщение вашему потоку пользовательского интерфейса, чтобы указать, что это сделано.

В обоих вышеупомянутых случаях пользовательский интерфейс будет реагировать на щелчки и события ввода, пока дочерний процесс все еще выполняется. Вам нужно будет закодировать свой поток пользовательского интерфейса, чтобы обработать это соответствующим образом (если это оправдано).

2
selbie 27 Дек 2013 в 02:31