我知道已经发布了类似的问题,但建议的解决方案对我不起作用。
我想在屏幕上找到一个窗口位置。我真正关心的唯一值是此窗口的左上角,没有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;
....
}
}
感谢任何帮助。感谢
为了提供更多信息,这里是我想要获得的图片(忽略底部的键盘):
答案 0 :(得分:4)
我认为您正在寻找的是GetClientRect,它将为您提供窗口的客户端矩形。 left
和top
值将为(0, 0)
,但right
和bottom
会为您提供宽度和高度。
然后,您可以调用ClientToScreen,传递窗口句柄和(0,0)
点。这将为您提供客户区左上角的屏幕坐标。只需添加宽度和高度(从上一次调用到GetClientRect
),您就可以拥有它。