GetWindowRect为left&返回相同的值对

时间:2011-05-28 00:33:52

标签: c# windows winapi

我正在尝试捕获浏览器屏幕截图,我的一个Win32 api方法是GetWindowRect。这是返回相同的左和右;正确的价值。只有当我在具有Win7作为操作系统的远程计算机上运行我的应用程序时才会发生这种情况。

此PrintWindow方法也在本机中失败。如果有人在遇到此问题之前请告诉我。

以上两种方法适用于远程机器中的Vista和XP作为操作系统。

添加我的应用程序的一些方法。

    [DllImport("user32.dll")]
    public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, uint nFlags);
    [DllImport("user32.dll")]
    public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle);

    private Image Capture(IntPtr hwnd)
    {
        Rectangle windowSize = this.GetWindowPosition(hwnd);

        Bitmap bm = new Bitmap(windowSize.Width, windowSize.Height);
        using (Graphics g = Graphics.FromImage(bm))
        {
            IntPtr hdc = g.GetHdc();

            if (PrintWindow(hwnd, hdc, 0) == false)
            {
                throw new Exception("PrintWindow call failed");
            }

            g.ReleaseHdc(hdc);
            g.Flush();
        }

        return bm;
    }



    private Rectangle GetWindowPosition(IntPtr hwnd)
    {
        Rect r = new Rect();
        GetWindowRect(hwnd, ref r);

        return new Rectangle(r.Left, r.Top, r.Width, r.Height);
    }

1 个答案:

答案 0 :(得分:2)

您没有检查Win32返回代码。我的猜测是GetWindowRect由于某种原因失败了,因此没有为rect分配任何值。因此,它的价值仍未被初始化。

检查返回值,如果调用失败,请使用Marshal.GetLastWin32Error()查找原因。您还需要更新P / Invokes:

[DllImport("user32.dll", SetLastError=true)]
public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, uint nFlags);
[DllImport("user32.dll", SetLastError=true)]
public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle);
...
if (!GetWindowRect(hwnd, ref r))
    int ErrorCode = Marshal.GetLastWin32Error();