GetWindowRect始终返回相同的值

时间:2014-03-04 21:46:28

标签: c# winapi

我知道已经发布了类似的问题,但建议的解决方案对我不起作用。

我想在屏幕上找到一个窗口位置。我真正关心的唯一值是此窗口的左上角没有Top-Title栏

这是我正在使用的功能:

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

RECT定义如下:

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

所以我总是得到窗口位于屏幕不同位置的相同值:

Bottom = screen_height
Right = screen_width
Top = -4 // <--
Left = -4 // <--

操作系统:Windows 7。

App:这是Surface应用程序(使用Surface SDK 2.0)

更新

经过一系列评论后,建议使用Spy ++来仔细检查Window Handle。然后我发现Spy ++返回的Handle与我使用的Handle不同。 当手动更改Handle时(在Debug模式下),我开始得到一些更合理的结果。

这就是我获取Window Handle的方法:

public partial class SurfaceWindow1 : SurfaceWindow
{

    public SurfaceWindow1()
    {
        InitializeComponent();

        IntPtr handle = new WindowInteropHelper(this).Handle;
        ....
    }
}

感谢任何帮助。感谢

为了提供更多信息,这里是我想要获得的图片(忽略底部的键盘):

enter image description here

1 个答案:

答案 0 :(得分:4)

我认为您正在寻找的是GetClientRect,它将为您提供窗口的客户端矩形。 lefttop值将为(0, 0),但rightbottom会为您提供宽度和高度。

然后,您可以调用ClientToScreen,传递窗口句柄和(0,0)点。这将为您提供客户区左上角的屏幕坐标。只需添加宽度和高度(从上一次调用到GetClientRect),您就可以拥有它。