WinAPI。检查窗口大小调整是否已完成

时间:2019-04-05 09:45:47

标签: c++ winapi

我有C ++应用程序(用于通过网络共享应用程序的窗口)。在服务器端更改大小时,我需要在客户端更新应用程序区域。为此,我每隔一段时间致电GetWindowPos来检查窗口是否已调整大小。但是我不想在窗口处于调整大小状态时发送信息,而仅在调整大小完成后才发送信息。我注意到在Windows 8.1和Windows 10 GetWindowPos上,当窗口处于调整大小状态时返回相同的值,但是在Windows 7上,当窗口处于调整大小状态时它返回不同的值。那么问题是如何了解窗口是否处于调整大小状态?

UPD WM_ENTERSIZEMOVE-WM_EXITSIZEMOVE变体的实现

void WindowsDisplayHelperMasterWindow::SetMsgHook()
{
    m_pThis = this;
    m_msgHook = SetWindowsHookEx(WH_GETMESSAGE, MsgPoc, NULL, 0);
}

调用该类的非静态方法的静态函数

LRESULT CALLBACK WindowsDisplayHelperMasterWindow::MsgPoc(int code, WPARAM wParam, LPARAM lParam)
{
    if (m_pThis != nullptr)
    {
        return m_pThis->GetMsgProcHook(code, wParam, lParam);
    }
    return CallNextHookEx(0, code, wParam, lParam);
}

挂钩功能:

LRESULT CALLBACK WindowsDisplayHelperMasterWindow::GetMsgProcHook(int code, WPARAM wParam, LPARAM lParam)
{
    if (code < 0)
    {
        return CallNextHookEx(0, code, wParam, lParam);
    }
    MSG* lpmsg = (MSG*)lParam;
    if (lpmsg->hwnd != m_windowHandle)
    {
        return CallNextHookEx(0, code, wParam, lParam);
    }
    if (lpmsg->message == WM_ENTERSIZEMOVE && !m_isWindowResizing)
    {
        m_isWindowResizing = true;
    }
    else if (lpmsg->message == WM_EXITSIZEMOVE && m_isWindowResizing)
    {
        m_isWindowResizing = false;
    }

    return CallNextHookEx(0, code, wParam, lParam);
}

m_pThism_msgHook是静态类成员:

WindowsDisplayHelperMasterWindow* WindowsDisplayHelperMasterWindow::m_pThis = nullptr;
HHOOK WindowsDisplayHelperMasterWindow::m_msgHook = NULL;

这是支票本身:

if (!m_displayMode.IsEqualGeometry(displayMode) && !m_isWindowResizing)
{
    DUMPER_DEBUG("DS_ERROR_MODE_CHANGED");
    return DS_ERROR_MODE_CHANGED; // depending on this value server asks client to update application's window area
}

谢谢。

1 个答案:

答案 0 :(得分:4)

窗口进入移动和大小调整模态循环后,会收到一条WM_ENTERSIZEMOVE消息。退出移动或大小调整模态循环后,窗口会收到WM_EXITSIZEMOVE消息。

如果监视这两个消息,您将知道窗口何时处于移动和调整大小状态。