Domanda

Io uso BitBlt () e CreateBitmapSourceFromHBitmap () per catturare una finestra come un BitmapSource che posso visualizzare su un elemento immagine in un'applicazione WPF. Ma per qualche motivo, la maggior parte delle applicazioni che cattura è trasparente. Qui è una sorgente di immagine cattura di quello che sta accadendo rispetto:

https://userpages.umbc.edu/~smyth1/images/screencap.PNG
(fonte: umbc.edu )

E 'grigia perché lo sfondo della finestra è su è grigia. Qualunque sfondo Io do la finestra sarà visibile attraverso.

Come posso ottenere l'immagine catturata per riflettere in modo più accurato l'originale?

È stato utile?

Soluzione

Il problema nel codice potrebbe essere dovuto alle API Win32 che si sta utilizzando (CreateCompatibleDC, SelectObject, CreateBitmap ...). Ho provato con un codice più semplice, utilizzando solo GetDC e BitBlt, e funziona bene per me. Ecco il mio codice:

    public static Bitmap Capture(IntPtr hwnd)
    {
        IntPtr hDC = GetDC(hwnd);
        if (hDC != IntPtr.Zero)
        {
            Rectangle rect = GetWindowRectangle(hwnd);
            Bitmap bmp = new Bitmap(rect.Width, rect.Height);
            using (Graphics destGraphics = Graphics.FromImage(bmp))
            {
                BitBlt(
                    destGraphics.GetHdc(),
                    0,
                    0,
                    rect.Width,
                    rect.Height,
                    hDC,
                    0,
                    0,
                    TernaryRasterOperations.SRCCOPY);
            }
            return bmp;
        }
        return null;
    }

L'ho provato in Windows Form e WPF (con Imaging.CreateBitmapSourceFromHBitmap), funziona benissimo in entrambi i casi per lo stesso screenshot (SO pagina in Firefox).

HTH,

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top