C# GetWindowRect始终返回相同的值
我知道类似的问题已经发布了,但是提议的解决方案对我不起作用 我正试图在屏幕上找到一个窗口位置。我真正关心的唯一值是该窗口的左上角点,没有顶部标题栏 这是我正在使用的函数:C# GetWindowRect始终返回相同的值,c#,winapi,C#,Winapi,我知道类似的问题已经发布了,但是提议的解决方案对我不起作用 我正试图在屏幕上找到一个窗口位置。我真正关心的唯一值是该窗口的左上角点,没有顶部标题栏 这是我正在使用的函数: [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); 其中,R
[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 // <--
感谢您的帮助。谢谢
为了提供更多信息,下面是我想要得到的图片(忽略底部的键盘):
我认为您要查找的是,它将为您提供窗口的客户端矩形。
左侧
和顶部
的值将是(0,0)
,但右侧
和底部
提供了宽度和高度
然后可以调用,传递窗口句柄和
(0,0)
点。这将为您提供客户端区域左上角的屏幕坐标。只需添加宽度和高度(从上一次调用到GetClientRect
),就可以了。我想您要找的是,它将为您提供窗口的客户端矩形。左侧
和顶部
的值将是(0,0)
,但右侧
和底部
提供了宽度和高度
然后可以调用,传递窗口句柄和
(0,0)
点。这将为您提供客户端区域左上角的屏幕坐标。只需添加宽度和高度(从上一次调用到GetClientRect
),就可以了。这些坐标看起来像是窗口被最大化了,是吗?“没有顶部标题栏”是什么意思?你说的是客户区的位置吗?不,窗口没有最大化。我所说的顶部标题栏是指包含窗口名称的标题栏,以及最小化/最大化/关闭窗口的小图标。抱歉,输入了错误的术语。那么,GetWindowRect
返回什么?我们怎样才能复制这个呢?IIRC,最大坐标为-8,-8,屏幕右侧+8,屏幕底部+8@DavidHeffernanGetWindowRect返回true。TBH,我不确定这是如何复制的。我的应用程序是Surface(SDK 2.0)应用程序。这有关系吗?那篇博文的链接很难令人信服。使用Spy++代替。这些坐标看起来像是窗口被最大化了-是吗?“没有顶部标题栏”是什么意思?你说的是客户区的位置吗?不,窗口没有最大化。我所说的顶部标题栏是指包含窗口名称的标题栏,以及最小化/最大化/关闭窗口的小图标。抱歉,输入了错误的术语。那么,GetWindowRect
返回什么?我们怎样才能复制这个呢?IIRC,最大坐标为-8,-8,屏幕右侧+8,屏幕底部+8@DavidHeffernanGetWindowRect返回true。TBH,我不确定这是如何复制的。我的应用程序是Surface(SDK 2.0)应用程序。这有关系吗?那篇博文的链接很难令人信服。改用Spy++。我用FindWindow()解决了这个问题。这给了我正确的窗户把手。我仍然感谢吉姆的努力。ThanksI使用FindWindow()解决。这给了我正确的窗户把手。我仍然感谢吉姆的努力。谢谢
public partial class SurfaceWindow1 : SurfaceWindow
{
public SurfaceWindow1()
{
InitializeComponent();
IntPtr handle = new WindowInteropHelper(this).Handle;
....
}
}