在C#中获取外部窗口的内部大小和位置

时间:2016-08-06 17:28:13

标签: c# window size

我想在C#中获取外部窗口(如Firefox或Explorer)的内部大小和位置。我试过,但我没有什么可以开始的(只有整个窗口或自己的表格大小)。

1 个答案:

答案 0 :(得分:1)

要使用任意窗口执行此操作,您需要转到Win32 API。

对于位置,您需要窗口矩形。您需要窗口句柄(HWND)才能执行此操作。 Here's an answer describing how to do that.以下是该答案的代码:

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int Left;        // x position of upper-left corner
        public int Top;         // y position of upper-left corner
        public int Right;       // x position of lower-right corner
        public int Bottom;      // y position of lower-right corner
    }

    Rectangle myRect = new Rectangle();

    private void button1_Click(object sender, System.EventArgs e)
    {
        RECT rct;

        if(!GetWindowRect(new HandleRef(this, this.Handle), out rct ))
        {
            MessageBox.Show("ERROR");
            return;
        }
        MessageBox.Show( rct.ToString() );

        myRect.X = rct.Left;
        myRect.Y = rct.Top;
        myRect.Width = rct.Right - rct.Left + 1;
        myRect.Height = rct.Bottom - rct.Top + 1;
    }

他正在使用前景窗口(请参阅上面链接中StackOverflow页面顶部的问题)。我不知道你想要什么窗口或者你打算如何获得它;你没有提供任何相关的信息。

一旦你有了窗口句柄,就可以调用GetClientRect() Win32函数来获取窗口的内部“客户区”尺寸:这意味着除了标题栏和边框之外的所有内容。一旦你有GetWindowRect()在C#中工作,PInvoke声明就很容易推断,但here it is anyway