4

我编写了一个简单的启动器,它查找实际程序然后执行它。这工作正常,但有一个问题: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

2 回答 2

4

显然,Windows 期望 Windows 程序处理消息并且不认为它在此之前完全启动,这就是它显示 appstarting 光标的原因。

添加以下代码来处理单个虚拟消息解决了该问题:

MSG msg;
PostMessage(NULL, WM_NULL, 0, 0);
GetMessage(&msg, NULL, 0, 0);
于 2013-12-27T02:07:09.697 回答
2

您的程序正在显示沙漏图标,因为您的 UI 线程由于在 WaitForSingleObject 调用上停滞而挂起。请记住,WaitForSingleObject 直到子进程退出后才会返回。您可以将 Wait 调用替换为 Sleep 并获得相同的效果。

你有一些选择:

  1. 使用MsgWaitForMultipleObjects而不是 WaitForSingleObject。这是更正式的方式来泵送消息并同时等待,而不是您在自己的答案中建议的 PostMessage/GetMessage 事情。

  2. 在另一个线程上执行 Wait 调用。当线程返回时,它会向您的 UI 线程 PostMessage 以指示它已完成。

在上述两种情况下,UI 都会在子进程仍在发生时响应点击和输入事件。您将需要对您的 UI 线程进行编码以酌情处理此问题(如果有必要)。

于 2013-12-27T02:31:26.513 回答