SHCruz Ответов: 1

Захват окна с помощью встроенного (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;
        }

1 Ответов

Рейтинг:
11

SHCruz

После использования SetParent с окном Directx необходимо обновить winform. Просто: это.Освежить();