在
Windows XP及以上版本中,给定了一个窗口句柄(HWND),如何判断窗口位置和大小是否离开窗口不可退避?例如,如果标题栏可用于光标,则可以将窗口拖回屏幕.我需要发现窗口是否实际上是可见的或至少可用于用户.我想我还需要知道如何检测和响应分辨率的变化以及如何处理多个显示器.这似乎是一个相当大的事情.我正在使用C和常规的SDK,所以请限制您的答案,而不是调用C#或类似的平台.
解决方法
Windows使得在主监视器上确定用户工作区域的大小变得相对简单(即,屏幕的区域不被任务栏遮蔽).调用
SystemParametersInfo
函数并为第一个参数(uiAction)指定SPI_GETWORKAREA标志. pvParam参数应指向将在虚拟屏幕坐标中接收工作区域坐标的
RECT
structure.
一旦找到了描述工作区域的坐标,就可以将这些坐标与应用程序窗口的当前位置进行比较,以确定它是否位于这些界限之内.
支持多个显示器的愿望使事情稍微复杂一些. SystemParametersInfo的文档表明您需要调用GetMonitorInfo
function来获取主要的监视器的工作区域.它填写一个名为MONITORINFOEX
的结构,其中包含定义该监视器的工作区域的成员rcWork,再次以虚拟屏幕坐标表示为RECT结构.
为此,您需要枚举用户连接到系统的所有监视器,并使用GetMonitorInfo检索每个监视器的工作区域.
有几个在互联网上可以找到的样本:
> MSDN有一些Positioning Objects on a Multiple Display Setup的示例代码.
>如果您使用的是MFC,那么这是多个显示器支持的an excellent example.
>即使您不使用MFC,该文章也提到了the following link,它看起来是一个真正的宝石,只要解释多个显示器支持在Windows中的工作,即使它是一个有点老的学校.喜欢与否,在以后的Windows版本中,很少有这种变化.
最后,你提到想要检测分辨率的变化.这比你想像的要简单得多您知道如果您完成任何Windows编程,操作系统与您的应用程序通信的主要方式是通过向WindowProc
function发送消息.
在这种情况下,您将需要观看WM_DISPLAYCHANGE
message,当显示分辨率发生变化时,会发送到所有窗口. wParam包含以像素为单位的新图像深度; lParam的低位字指定水平分辨率,lParam的高位字指定屏幕的垂直分辨率.