应用程序最小化时单击显示桌面/最小化全部
Application minimizes belatedly when clicking show desktop /minimize all
我有一个相当大的应用程序,具有多个线程(例如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 周期或其他东西。删除代码后,应用程序会立即最小化。
- 找到两对数字,使它们的乘积的绝对差最小化
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 超轻 - 如何最小化窗口
- 在C++中使用 GSL 最小化
- 在C++中最小化变量的范围
- 当只有一个线程主要使用该对象而其他线程很少使用它时,如何最小化该对象的互斥锁锁定?
- "最小化"按钮不会出现在 MFC 对话框中
- 从小于或等于某个 N 的数字列表中最小化或找到 n 个理想的子集和
- 如何排列二进制字符串以最小化它们之间的距离
- 最小化 C++ 中的内存使用
- 禁用 GPO 的空气抖动最小化
- 如何隐藏最大化和最小化按钮并在qml应用程序窗口中显示关闭按钮?
- 如何使用 stl 最小化 c++ 中所有打开的窗口
- 如何最小化嵌入式平台上的内存分配
- 可见程序或最小化程序时的过程ID更改
- 删除/最小化GIT合并冲突
- 当模式窗口最小化时,最小化所有应用程序窗口(在 Linux 上)
- 应用程序最小化时单击显示桌面/最小化全部
- 如何在Qt中打开外部应用程序并将其最小化到系统托盘
- 什么是窗口最大化/最小化/恢复的WM Windows消息