我有一个相当大的应用程序,具有多个线程(例如Opengl渲染线程)和图形用户界面。单击标题栏中的最小化按钮时,应用程序将立即关闭。 但是,当单击Windows任务栏上的“显示桌面”或按Win + D或Win + M时,应用程序将延迟最小化(几秒钟后)。
我在(相当大的)代码库中搜索了SC_MINIMIZE,W_MINIMIZE等的出现,但均未成功。在单击“显示桌面”以检查是否锁定了某些线程之后,我也暂停了执行,但是找不到任何问题(但是,我在多线程领域的调试技能有些欠缺)。无论如何,标题栏中的快速最小化证明了它应该是可能的。
我试图更好地理解这个问题:当最小化命令来自应用程序外部时,会发生什么不同?这些命令在MFC应用程序中到达哪里?
我希望在单击任务栏上的“显示桌面”或按win + D或win + M时,应用程序能够迅速最小化。但是,它使延迟最小化。
其他信息:
启动应用程序时,仅调用一次CFrameWnd :: ActivateFrame(nCmdShow)。
这是渲染线程的创建:
m_threadObject = new MyRenderThread();
// If the thread is currently running, return error
if( m_threadObject ->getCurrentStatus() != Stopped )
return false;
m_threadObject ->setCurrentStatus( Initialized );
m_threadObject ->setContinueFlag( true );
// Create the thread
m_threadObject ->handle = AfxBeginThread(_sgThreadInternal::ThreadProc, (void*)m_threadObject);
// if the creation failed, reset status, and return error
if( m_threadObject ->handle == NULL )
{
m_threadObject ->setCurrentStatus( Stopped );
return false;
}
// if the wait flag is set, wait for the status to change
if( waitFlag )
{
while( m_threadObject ->getCurrentStatus() == Initialized )
{
sgThread::sleep(1);
}
}
线程之间的通信通过来回发送事件来进行,例如:
MyRenderThread::sendEvent([this, name]()
{
if (!this->load(name))
{
this->unload();
}
} );
但是我不相信线程是问题所在。 我发现单击最小化按钮时调用了OnSysCommand()消息处理程序,但是如果单击了显示桌面按钮,则不会调用该消息处理程序。在测试应用程序中,我创建的OnSysCommand()在单击show desktop时被调用。
磨牙更新:
如果您创建另一个应用程序,甚至使用EnumWindows()在所有窗口中进行迭代并发送,我的应用程序甚至会被最小化
::SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
使用应用程序的窗口句柄。
似乎只显示了桌面,Win + D和Win + M被阻止了。
答案 0 :(得分:0)
我找到了以下代码:
BOOL CMyApplicationApp::OnIdle(LONG lCount)
{
CWinApp::OnIdle(lCount);
[...]
::Sleep(5);
if(m_mainFrame->IsIconic())
{
::Sleep(100);
}
::SwitchToThread();
return TRUE;
}
在文档中阅读有关CWinApp :: OnIdle()的信息使我相信,sleep()有点多余。我假设原始开发人员想节省CPU周期或其他东西。删除代码后,应用程序会立即最小化。