我以前从未使用过Windows。我付出了很多努力来获取正确的X和Y坐标以及窗口的大小以及窗口的客户区域的大小。

不幸的是,客户区的X和Y始终为零。我在文档中进行了查找,应该为零。

在SO上,我发现需要将客户端传递给ClientToScreen(),以将客户端坐标转换为屏幕坐标。但是,结果并非我期望的那样。

我得到的是Point(1,57027688545264E-312,0)而不是Point(50,50)(或类似的数字)。

有人可以启发我怎么做吗?

到目前为止,这是我的代码:

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetClientRect(IntPtr hWnd, out Rect rect);

    [DllImport("user32.dll")]
    static extern bool ClientToScreen(IntPtr hWnd, ref System.Windows.Point lpPoint);

    [StructLayout(LayoutKind.Sequential)]
    public struct Rect
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    static Rectangle GetClientRect(IntPtr handle)
    {
        Rect rect;
        GetClientRect(handle, out rect);
        System.Windows.Point p = new System.Windows.Point(0, 0);
        ClientToScreen(handle, ref p);
        rect.Left = (int)p.X;
        rect.Top = (int)p.Y;
        return new Rectangle(rect.Left, rect.Top, rect.Right, rect.Bottom);
    }

最佳答案

System.Windows.Point结构与ClientToScreen不兼容。您应该改用System.Drawing.Point

关于c# - ClientToScreen意外的返回值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34534279/

10-10 09:18