Захват окна с помощью встроенного (setparent) directx game C#
Цель:
- Захват окна winform, содержащего игровое окно directx (например, скриншот, но конкретный дескриптор).
Сценарий:
- Внутри winform я вставляю panel1 нормально.
- Я использовал winapi SETPARENT, чтобы вставить главное игровое окно directx внутрь penel1
Проблема:
При захвате окна winform (this.handle) изображение встроенной игры в panel1 не отображается. Появляется только панель.
Я не могу использовать метод скриншота, потому что он приведет к появлению еще одного окна.
Пример:
С помощью скриншота (захват экрана)
С помощью WinAPI (захват конкретного окна)
Что я уже пробовал:
public Image CaptureWindow(IntPtr handle, int imgX = 0, int imgY = 0, int largura = 0, int altura = 0) { // get te hDC of the target window IntPtr hdcSrc = User32.GetWindowDC(handle); // get the size User32.RECT windowRect = new User32.RECT(); User32.GetWindowRect(handle, ref windowRect); if(largura == 0 || altura == 0) { largura = windowRect.right - windowRect.left; altura = 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, largura, altura); // select the bitmap object IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap); // bitblt over //GDI32.BitBlt(hdcDest, 0, 0, largura, altura, hdcSrc, 0, 0, GDI32.SRCCOPY); GDI32.BitBlt(hdcDest, 0, 0, largura, altura, hdcSrc, imgX, imgY, GDI32.SRCCOPY); // restore selection GDI32.SelectObject(hdcDest, hOld); // clean up GDI32.DeleteDC(hdcDest); User32.ReleaseDC(handle, hdcSrc); // get a .NET image object for it Image img = Image.FromHbitmap(hBitmap); // free up the Bitmap object GDI32.DeleteObject(hBitmap); return img; }