【问题标题】:WinAPI. Check if window resizing has been finishedWinAPI。检查窗口大小调整是否已完成
【发布时间】:2019-08-27 04:35:56
【问题描述】:

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

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_pThis 和 m_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
}

谢谢。

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

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

    如果您监控这两条消息,您就会知道窗口何时处于移动和调整大小状态。

    【讨论】:

    • 我用你的变体实现更新了我的初始代码。你的意思是像我实现的那样吗?
    • 很遗憾,hook 这些消息不是我的变种。还有其他方法可以检查应用程序的窗口是否正在调整大小?
    • 如果您不了解使用全局挂钩的含义,请再次阅读documentation:“所有全局挂钩函数必须在库中。”
    • 这就是为什么这个解决方案不适合我,这就是为什么如果有任何其他变体可以检查窗口是否处于调整大小状态,我会很感兴趣。
    • 没有。而且,为什么适合所有人的解决方案不适合您,这很令人怀疑。
    猜你喜欢
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多