Multithreading 检测窗口还原操作即将开始

Multithreading 检测窗口还原操作即将开始,multithreading,winapi,event-handling,directx,Multithreading,Winapi,Event Handling,Directx,最大化操作即将开始时生成WM_GETMINMAXINFO,最大化操作完成时生成WM_SIZE 还原操作完成时也会生成WM_SIZE 但如何检测即将开始的窗口还原操作? 我需要检测窗口即将恢复的确切时刻,而不是已经恢复的时刻。我正在开发多线程DirectX应用程序。我在专用的辅助线程中渲染。当窗口即将开始最大化或还原时,我需要更改渲染回缓冲区大小(DirectX设备Reset)。我只能从主线程调整后缓冲区的大小,所以我使用关键部分与渲染线程同步。问题是我无法中断渲染线程中的Present操作,当

最大化操作即将开始时生成
WM_GETMINMAXINFO
,最大化操作完成时生成
WM_SIZE

还原操作完成时也会生成
WM_SIZE

但如何检测即将开始的窗口还原操作?



我需要检测窗口即将恢复的确切时刻,而不是已经恢复的时刻。我正在开发多线程
DirectX
应用程序。我在专用的辅助线程中渲染。当窗口即将开始最大化或还原时,我需要更改渲染回缓冲区大小(
DirectX设备
Reset
)。我只能从主线程调整后缓冲区的大小,所以我使用
关键部分
与渲染线程同步。问题是我无法中断渲染线程中的
Present
操作,当最大化或还原操作即将开始时,我会等待当前
Present
操作完成,然后才开始调整大小(最大化/还原)。如果更改回缓冲区大小太晚(当最大化/还原操作完成时(
WM_size
message),您可能会注意到旧帧的大小错误(图像被拉伸).

好吧,很高兴看到有人还在思考这些问题。这些小事情,比如在调整大小时拉伸一秒钟的图像,将外观专业的应用程序与卧室编码的应用程序区分开来

在我的旧代码中,我发现了一些可能会让您感兴趣的技巧。 首先,您可以检查
WM\u SYSCOMMAND

        case WM_SYSCOMMAND:
           {
               switch (wParam)
               {
               case SC_MAXIMIZE:
                   std::cout << "Going to MAXIMIZE: " << std::endl;
                   break;

               case SC_MINIMIZE:
                   std::cout << "Going to MINIMIZE: " << std::endl;

                   break;

               case SC_RESTORE:
                   std::cout << "Going to RESTORE: " << std::endl;
                   break;


               default:
                   break;
               }
               return DefWindowProc(m_hWnd, msg, wParam, lParam);
           }
参见实用程序函数

当我们玩得够多的时候,我们现在可以让它变得有用:

                bool bFrameChanged = ((wp->flags) & SWP_FRAMECHANGED) > 0;
            bool bNoCopyBits = ((wp->flags) & SWP_NOCOPYBITS) > 0;
            bool bNormal = (!m_bMaximized) && (!m_bMinimized);

            // from maximized
            if(m_bMaximized && bFrameChanged && !bNoCopyBits)
            {
                std::cout << " MAXIMIZED -> NORMAL " << std::endl;
            }
            if (m_bMaximized && bFrameChanged && bNoCopyBits)
            {
                std::cout << " MAXIMIZED -> MINIMIZED " << std::endl;
            }

            // from normal states
            if (bNormal && bFrameChanged && !bNoCopyBits)
            {
                std::cout << " NORMAL -> MAXIMIZED " << std::endl;
            }
            if (bNormal && bFrameChanged && bNoCopyBits)
            {
                std::cout << " NORMAL -> MINIMIZED"  << std::endl;
            }

            // from minimized
            if(m_bMinimized && bFrameChanged)
            {
                std::cout << " MINIMIZED -> MAXIMIZED " << std::endl;
            }
            if(m_bMinimized && m_bMaximized && bFrameChanged)
            {
                std::cout << " MINIMIZED -> MAXIMIZED " << std::endl;
            }


            return DefWindowProc(m_hWnd, msg, wParam, lParam);
boolbframechanged=((wp->flags)&SWP\u FRAMECHANGED)>0;
bool bNoCopyBits=((wp->flags)和SWP_NOCOPYBITS)>0;
布尔b正态=(!m_b最大化)&(!m_b最小化);
//从最大化
if(m_b最大化和&bFrameChanged和&bNoCopyBits)
{
标准::cout
                bool bFrameChanged = ((wp->flags) & SWP_FRAMECHANGED) > 0;
            bool bNoCopyBits = ((wp->flags) & SWP_NOCOPYBITS) > 0;
            bool bNormal = (!m_bMaximized) && (!m_bMinimized);

            // from maximized
            if(m_bMaximized && bFrameChanged && !bNoCopyBits)
            {
                std::cout << " MAXIMIZED -> NORMAL " << std::endl;
            }
            if (m_bMaximized && bFrameChanged && bNoCopyBits)
            {
                std::cout << " MAXIMIZED -> MINIMIZED " << std::endl;
            }

            // from normal states
            if (bNormal && bFrameChanged && !bNoCopyBits)
            {
                std::cout << " NORMAL -> MAXIMIZED " << std::endl;
            }
            if (bNormal && bFrameChanged && bNoCopyBits)
            {
                std::cout << " NORMAL -> MINIMIZED"  << std::endl;
            }

            // from minimized
            if(m_bMinimized && bFrameChanged)
            {
                std::cout << " MINIMIZED -> MAXIMIZED " << std::endl;
            }
            if(m_bMinimized && m_bMaximized && bFrameChanged)
            {
                std::cout << " MINIMIZED -> MAXIMIZED " << std::endl;
            }


            return DefWindowProc(m_hWnd, msg, wParam, lParam);