hat*_*cat 10 c++ windows winapi multiple-monitors css-position
在Windows XP及更高版本中,给定一个窗口句柄(HWND),如何判断窗口位置和大小是否无法挽回窗口?例如,如果标题栏可用于光标,则可以将窗口拖回屏幕.我需要发现窗口是否实际可见或至少对用户可用.我想我还需要知道如何检测和响应分辨率变化以及如何处理多个监视器.这似乎是一个相当大的交易.我正在使用C++和常规SDK,因此请限制您对该平台的回答,而不是调用C#或类似的.
Cod*_*ray 19
Windows使得确定主监视器上用户工作区域的大小(即,屏幕未被任务栏遮挡的区域)变得相对简单.调用该函数并为第一个参数()指定标志.该参数应指向结构将接收工作区的坐标在虚拟屏幕坐标.SystemParametersInfoSPI_GETWORKAREAuiActionpvParamRECT
一旦获得了描述工作区域的坐标,就可以将这些坐标与应用程序窗口的当前位置进行比较,以确定它是否位于这些边界内.
支持多个监视器的愿望使事情稍微复杂一些.该文档SystemParametersInfo建议您需要调用该GetMonitorInfo函数来获取除主服务器之外的监视器的工作区域.它填充一个名为的结构MONITORINFOEX,其中包含rcWork定义该监视器工作区域的成员,再次以虚拟屏幕坐标表示为RECT结构.
要做到这一点,您需要枚举用户连接到系统的所有监视器并检索每个使用的工作区域GetMonitorInfo.
在互联网上可以找到一些这样的样本:
最后,您提到要检测分辨率更改.这比你想象的要简单得多.如您所知,如果您已经完成了任何Windows编程,则操作系统与您的应用程序通信的主要方式是向您的WindowProc函数发送消息.
在这种情况下,您需要查看WM_DISPLAYCHANGE消息,当显示分辨率发生变化时,该消息将发送到所有窗口.所述wParam包含在每个像素的位数的新的图像的深度; 低位字lParam指定水平分辨率,高位字lParam指定屏幕的垂直分辨率.
您可以使用 MonitorFromRect 或 MonitorFromPoint 检查窗口的左上点或右下点是否不包含在任何显示监视器中(屏幕外)。
POINT p;
p.x = x;
p.y = y;
HMONITOR hMon = MonitorFromPoint(p, MONITOR_DEFAULTTONULL);
if (hMon == NULL) {
// point is off screen
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7562 次 |
| 最近记录: |