Я пытаюсь сделать скриншот игры DirectX. Я хочу захватить окно, даже если оно находится за другими окнами, не выводя окно вперед. Когда я запускаю приложение в моей системе, оно работает отлично. Однако во всех других системах, на которых я запускаю приложение, оно только захватывает границу, а область внутри становится черной.
Моя система, работает
Вторая система, только граница
Третья система, только граница
Мой код:
// get the hDC of the target window
IntPtr hdcSrc = User32.GetWindowDC(hWnd);
// get the size
Rectangle windowRect = new Rectangle();
User32.GetWindowRect(hWnd, ref windowRect);
int width = windowRect.Right - windowRect.Left;
int height = windowRect.Bottom - windowRect.Top;
// create a device context we can copy to
IntPtr hdcDest = Gdi32.CreateCompatibleDC(hdcSrc);
// create a bitmap we can copy it to,
// using GetDeviceCaps to get the width/height
IntPtr hBitmap = Gdi32.CreateCompatibleBitmap(hdcSrc, width, height);
// select the bitmap object
IntPtr hOld = Gdi32.SelectObject(hdcDest, hBitmap);
// bitblt over
Gdi32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, SRCCOPY);
// restore selection
Gdi32.SelectObject(hdcDest, hOld);
// clean up
Gdi32.DeleteDC(hdcDest);
User32.ReleaseDC(hWnd, hdcSrc);
// get a .NET image object for it
Image img = Image.FromHbitmap(hBitmap);
// free up the Bitmap object
Gdi32.DeleteObject(hBitmap);
if (bmp != null)
bmp.Dispose();
bmp = new Bitmap(img);
Если это имеет значение, моя системная видеокарта - NVIDIA GeForce GTX 970, вторая - NVIDIA GeForce GTX 1060, а третья - NVIDIA GeForce GTX 960M. Все системы Windows 10 64 бит.