Question

J'utilise BitBlt () et CreateBitmapSourceFromHBitmap () pour capturer une fenêtre en tant que BitmapSource que je peux afficher sur un élément d'image dans une application WPF. Mais pour une raison quelconque, la plupart de l'application qu'il capture est transparent. Voici une source par rapport à l'image de capture de ce qui se passe:


(source: umbc.edu )

Il est gris parce que l'arrière-plan de la fenêtre, il est sur est gris. Quel que soit le fond que je donne la fenêtre transparaître.

Comment puis-je obtenir l'image capturée afin de mieux refléter l'original?

Était-ce utile?

La solution

Le problème dans votre code pourrait être dû à l'API Win32 que vous utilisez (CreateCompatibleDC, SelectObject, CreateBitmap ...). J'ai essayé avec un code plus simple, en utilisant uniquement GetDC et BitBlt, et il fonctionne très bien pour moi. Voici mon code:

    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;
    }

Je l'ai essayé dans Windows Forms et WPF (avec Imaging.CreateBitmapSourceFromHBitmap), il fonctionne très bien dans les deux cas pour la même capture d'écran (SO page dans Firefox).

HTH,

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top