windows api 通过句柄获取控件在窗口的坐标问题?

wbz008 2016-03-02 10:34:17






NativeRECT sRECT = new NativeRECT();
//get 屏幕 RECT
GetWindowRect(hWnd, out sRECT);
问题1:该方法有时获去到的值是负数 ? 求解答?
ScreenToClient(hWnd, ref xx);
问题2:该方法获取到的值 一直是0


//结构体布局 本机位置


[StructLayout(LayoutKind.Sequential)]
public struct NativeRECT
{
public int left;
public int top;
public int right;
public int bottom;
}
...全文
2893 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wbz008 2016-03-10
  • 打赏
  • 举报
回复
引用 2 楼 BitCoffee 的回复:
不知道你句柄怎样取得,你可以参考下面的。 1.GetWindowRect: 获取控件在屏幕的坐标: IntPtr hwnd = control.Handle; NativeRECT rect = new NativeRECT(); GetWindowRect(hwnd, out rect); 2. ScreenToClient:是把屏幕坐标转换为窗口坐标 屏幕坐标:相对于屏幕左上角的 窗口用户区:是相对于窗口用户区左上角的 一个窗体分为两部分:系统区和客户区,Width, Height 是指整体的,ClientWidth, ClientHeight是指客户区的,两者相减就是 系统区,也就是那些窗体的标题栏和边框等等。 所以此函数是取得屏幕左上角的点相对于用户区左上角为原点的坐标。 3.获取控件在窗口的坐标: public Point GetPoint(Control c) { Point point = new Point(0, 0); for(;c.Parent != null; c = c.Parent) { point.Offset(c.Location); } return point; } 此方法取得的是控件在窗体用户区的坐标。要想获取此控件在整个窗体的坐标,加上系统区的高和宽即可。 另外,.net有现成的函数 ,PointToClient和PointToScreen,可以不用系统api的。
问题已解决 GetWindowRect(hWnd, out sRECT); 方法 hWnd 句柄是主窗口的句柄 而非具体控件的句柄 ,把我这特了很久 无意中发现这个问题的
wbz008 2016-03-10
  • 打赏
  • 举报
回复
问题已解决 GetWindowRect(hWnd, out sRECT); 方法 hWnd 句柄是主窗口的句柄 而非具体控件的句柄 ,把我这特了很久 无意中发现这个问题的
tcmakebest 2016-03-03
  • 打赏
  • 举报
回复
hwnd取对了吗,GetWindowRect 会返回一个值表示是否成功,不会直接报错。
wbz008 2016-03-02
  • 打赏
  • 举报
回复
自己来顶一下
  • 打赏
  • 举报
回复
窗口最小化到任务栏的时候就是负数吧
BitCoffee 2016-03-02
  • 打赏
  • 举报
回复
不知道你句柄怎样取得,你可以参考下面的。 1.GetWindowRect: 获取控件在屏幕的坐标: IntPtr hwnd = control.Handle; NativeRECT rect = new NativeRECT(); GetWindowRect(hwnd, out rect); 2. ScreenToClient:是把屏幕坐标转换为窗口坐标 屏幕坐标:相对于屏幕左上角的 窗口用户区:是相对于窗口用户区左上角的 一个窗体分为两部分:系统区和客户区,Width, Height 是指整体的,ClientWidth, ClientHeight是指客户区的,两者相减就是 系统区,也就是那些窗体的标题栏和边框等等。 所以此函数是取得屏幕左上角的点相对于用户区左上角为原点的坐标。 3.获取控件在窗口的坐标: public Point GetPoint(Control c) { Point point = new Point(0, 0); for(;c.Parent != null; c = c.Parent) { point.Offset(c.Location); } return point; } 此方法取得的是控件在窗体用户区的坐标。要想获取此控件在整个窗体的坐标,加上系统区的高和宽即可。 另外,.net有现成的函数 ,PointToClient和PointToScreen,可以不用系统api的。

111,083

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧