Проблема с BitBtl и DWM (Windows Aero) - PullRequest
2 голосов
/ 09 марта 2011

Я разрабатываю приложение, которое должно делать скриншоты полноэкранной игры. Проблема в том, что я пробовал много способов, но любой из них может сделать снимок экрана, когда игра находится в полноэкранном режиме, он просто сделает снимок экрана с тем, что находится под игрой, и черный прямоугольник в верхнем левом углу.

Есть ли альтернатива для достижения этой цели, которая не связана с перехватом? Поскольку я использую C #, что является плохим языком для подобных вещей.

Это мой код прямо сейчас:

        Bitmap bmp = null;
        SIZE size;

        size.cx = Screen.PrimaryScreen.Bounds.Width;
        size.cy = Screen.PrimaryScreen.Bounds.Height;

        IntPtr Src = PlatformInvokeUSER32.GetDC(IntPtr.Zero);
        IntPtr Dest = PlatformInvokeGDI32.CreateCompatibleDC(Src);
        IntPtr HBitmap = (IntPtr)null;
        IntPtr hOld = IntPtr.Zero;

        HBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(Src, size.cx, size.cy);

        hOld = (IntPtr)PlatformInvokeGDI32.SelectObject(Dest, HBitmap);

        PlatformInvokeGDI32.BitBlt(Dest, 0, 0, size.cx, size.cy, Src, 0, 0, (PlatformInvokeGDI32.SRCCOPY|PlatformInvokeGDI32.CAPTUREBLT));

        bmp = System.Drawing.Image.FromHbitmap(HBitmap);

        PlatformInvokeGDI32.DeleteDC(Dest);
        PlatformInvokeUSER32.ReleaseDC(IntPtr.Zero.GetDesktopWindow(), Src);
        PlatformInvokeGDI32.DeleteObject(HBitmap);

Это нормально работает в XP, но когда дело доходит до Vista / 7, мне нужно отключить Aero, чтобы этот код работал, либо он просто сделает снимок экрана с тем, что находится под игрой, как я уже говорил.

...