GetWindowRect возвращает одинаковое значение для левого и правого - PullRequest
0 голосов
/ 28 мая 2011

Я пытаюсь сделать снимок экрана браузера, и один из моих методов 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 Ответ

2 голосов
/ 28 мая 2011

Вы не проверяете свои коды возврата Win32.Я предполагаю, что GetWindowRect по какой-то причине терпит неудачу и поэтому не присваивает значения прямоугольнику.Таким образом, его значения остаются неинициализированными.

Проверьте возвращаемое значение и, если вызов не удался, используйте 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...