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_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
}
谢谢。
解决方案
窗口在进入移动和调整模态循环后会收到WM_ENTERSIZEMOVE消息。窗口在退出移动或调整模态循环后会收到WM_EXITSIZEMOVE消息。
如果您监视这两条消息,您就会知道窗口何时处于移动和调整大小状态。
推荐阅读
- terraform - Terraform - 如何在 terraform 脚本中避免 VM 的密码
- java - 票务系统+定时器
- reactjs - 更新数组对象中的一个值
- javascript - 从 Django 后端使用 Javascript 加载多个图像
- c - 为什么直接给出字符串和读取字符串时strlen返回不同的值?
- ios - 如何使用 Macaw iOS 库从 url 显示 svg
- python - 加入数据框的过滤器在 pyspark 中不起作用
- java - 将 JSON ListView 转换为 Fragment
- windows - 如何修复我在 Windows 中遇到的这个 JMeter LoggerAppender 错误?
- python - Python:如何动态更新多个变量/字段