要将窗口的客户矩形转换为屏幕坐标,请调用MapWindowPoints函数。它实现了特殊处理以始终返回一个 valid RECT
,即使在涉及从右到左布局的窗口的场景中使用时也是如此:
如果hWndFrom或hWndTo(或两者)是镜像窗口(即具有WS_EX_LAYOUTRTL
扩展样式)并且恰好两个点在lpPoints中传递,MapWindowPoints
则将这两个点解释为 aRECT
并可能自动交换该矩形的左右字段以确保左不大于右。
相反,在这两点上调用ClientToScreen无法考虑 RTL 布局,并且可能会产生无效的RECT
. 它未能遵守矩形坐标不变量之一:
矩形右侧的坐标值必须大于其左侧的坐标值。同样,底部的坐标值必须大于顶部的坐标值。
在屏幕坐标中返回窗口的客户矩形的可靠函数如下所示:
RECT client_rect_in_screen_space(HWND const hWnd) {
RECT rc{ 0 };
if (!::GetClientRect(hWnd, &rc)) {
auto const err_val{ ::GetLastError() };
throw std::system_error(err_val, std::system_category());
}
::SetLastError(ERROR_SUCCESS);
if(::MapWindowPoints(hWnd, nullptr, reinterpret_cast<POINT*>(&rc), 2) == 0) {
auto const err_val{ ::GetLastError() };
if (err_val != ERROR_SUCCESS) {
throw std::system_error(err_val, std::system_category());
}
}
return rc;
}
问题更新要求一个不同的、不相关的问题。系统中没有内置 API,可让您查询 Web 浏览器的显示区域以获取其 HTML 内容。最有希望的解决方案是使用UI 自动化。然而,这个问题过于宽泛,无法在此处提供更详细的答案。