应用程序最小化时单击显示桌面/最小化全部

Application minimizes belatedly when clicking show desktop /minimize all

本文关键字:最小化 全部 显示桌面 单击 应用程序      更新时间:2023-10-16

我有一个相当大的应用程序,具有多个线程(例如Opengl渲染线程)和图形用户界面。单击标题栏中的最小化按钮时,应用程序会立即关闭。 但是,当单击窗口任务栏上的"显示桌面"或按 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()。

摩尔更新:

如果您创建另一个应用程序,使用 EnumWindows() 遍历所有窗口并发送,我的应用程序甚至会适当最小化

::SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);

使用应用程序的窗口句柄。

似乎只显示桌面,Win+D 和 Win+M 被阻止。

我找到了这段代码:

BOOL CMyApplicationApp::OnIdle(LONG lCount)
{
CWinApp::OnIdle(lCount);
[...]
::Sleep(5);
if(m_mainFrame->IsIconic())
{
::Sleep(100);
}
::SwitchToThread();
return TRUE;
}

在文档中阅读有关 CWinApp::OnIdle() 的信息使我确信 sleep() 位是多余的。我假设原始开发人员想要节省 CPU 周期或其他东西。删除代码后,应用程序会立即最小化。