我写了一个简单的启动程序,查找实际的程序,然后执行它。 这工作正常,但有一个问题:Windows显示“指针与沙漏”光标约给予秒。 如果我直接启动程序,这不会发生。
我试过设置sinfo.dwFlags = STARTF_FORCEOFFFEEDBACK
但这没有帮助。 我想这是因为它是我的程序,需要禁用游标和我开始的程序做的很好(它创build一个适当的窗口等)。
这是我的应用程序的相关代码。 我没有任何线程或任何其他花哨的东西(该程序的唯一目的是启动另一个程序,并将退出代码传递给其调用者以防万一)
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"); }
显然Windows希望Windows程序处理消息,并不认为它在这之前完全启动,这就是为什么它显示appstarting光标。
添加下面的代码来处理单个虚拟消息解决了这个问题:
MSG msg; PostMessage(NULL, WM_NULL, 0, 0); GetMessage(&msg, NULL, 0, 0);
你的程序正在显示沙漏图标,因为在WaitForSingleObject调用中,你的UI线程被挂起。 请记住,WaitForSingleObject直到子进程退出之后才会返回。 您可以使用睡眠替代等待呼叫,并获得相同的效果。
你有一些选择:
使用MsgWaitForMultipleObjects而不是WaitForSingleObject。 这是更正式的方式来泵送消息,并在同一时间等待,而不是你自己的答案中建议PostMessage / GetMessage的东西。
在另一个线程上进行等待调用。 当线程返回时,PostMessage会向UI线程发送一些信息,表示已完成。
在上述两种情况下,当子进程仍在进行时,UI将响应点击和输入事件。 你将需要编写你的UI线程来处理这个适当的(如果这是保证)。