如何获取窗口客户区的坐标

15

我可以使用GetClientRect和GetWindowRect Win32调用来获取窗口的整个区域以及客户端区域的坐标。但是问题在于,GetClientRect总是返回左上角的0,0坐标。如何确定实际的客户端区域相对于窗口矩形的位置?


1
如果您正在使用WinForms(根据下面的评论看起来是这样),您不应该使用PInvoke来实现此功能。使用Control.ClientRectangleControl.Bounds - lmat - Reinstate Monica
我需要使用PInvoke,因为我正在获取另一个应用程序窗口的坐标。 - Jeremy
5个回答

21

您可以使用 ClientToScreen 函数获取屏幕坐标系中左上角 (0,0) 点的坐标。通过 GetClientRect 返回的 RECT 结构体可获取右下角的坐标(只需将 ClientToScreen 返回的 POINT 结构体加上即可)。


2
我不明白为什么这是一个被接受的答案。这将客户端矩形映射到屏幕矩形。问题要求相对于窗口矩形的客户端矩形(在Win32中,窗口矩形包含所有窗口边框/修剪区域,位于客户端矩形之外)。 - Jon Watte
1
答案是正确的。WindowRect已经处于绝对屏幕坐标中。通过使用ClientToScreen()或MapWindowPoints()将ClientRect(其左上角位于0,0)映射到屏幕坐标后,它们都处于屏幕坐标中。 - Elmue

5
使用ClientToScreen将客户端坐标转换为屏幕坐标。窗口矩形(GetWindowRect)已经是屏幕坐标,并包括非客户区域(边框、标题等)。

这是我缺失的关键部分;并包括非客户区域(边框、标题等)。 谢谢! - nspire

3

如果您使用的是WinForms,则可以使用PointToScreen替代Reed Copsey提出的解决方案中的ClientToScreen。


2
窗口边框(包括其他元素)与客户区矩形(边框内部)之间的关系可以最轻松地通过使用AdjustWindowRectEx()来找到。获取窗口的样式和扩展样式,调用该函数,以查看每个侧面上有多少边框。

0

你也可以使用MapWindowPoints函数一次性将整个RECT转换为屏幕坐标。


这可以在Control.RectangleToScreen及其相似的方法Control.RectangleToClient中找到。 - lmat - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接