2010-07-13 150 views
10

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

+1

如果您使用WinForms(并根据您的意见,看起来像你),你不应该为此使用PInvoke。使用'Control.ClientRectangle'和'Control.Bounds'。 – 2011-09-15 16:12:28

+0

我需要使用PInvoke,因为我在另一个应用程序中获取窗口的坐标。 – Jeremy 2012-09-27 03:46:54

回答

16

您可以使用ClientToScreen来获取屏幕左上角(0,0)点的坐标坐标。由GetClientRect返回的RECT将适合让你在右下角(只需添加到由ClientToScreen设置的POINT)。

4

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

+0

,这是我失踪的关键一点; *并包括非客户区(边界,标题等)*谢谢! – nspire 2012-07-11 18:44:28

0

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

+0

这可以在Control.RectangleToScreen和它的表亲Control.RectangleToClient中找到。 – 2011-09-15 16:19:55

3

如果您正在使用WinForms,那么您可以使用PointToScreen而不是ClientToScreen作为Reed Copsey提出的解决方案。

+0

我喜欢iyt比API function.thx更好。 – ChadD 2011-03-17 11:19:54

0

使用AdjustWindowRectEx()最容易找到窗口矩形(带边框等)和客户端矩形(内部边框)之间的关系。获取窗口的样式和样式,并调用该函数,查看每边有多少边框。