PrintScreen 和 BitBlt 导致屏幕闪烁

时间:2021-03-15 00:04:36

标签: c# winapi bitblt printscreen

我正在尝试截取由有效 hwnd 指定的另一个窗口的屏幕截图。该程序有效,但是在截取屏幕截图时窗口会闪烁。

第一个函数使用 PrintScreen,第二个使用 BitBlt。每个都从每 10 秒截屏一次的例程中调用。

有没有办法在使用 PrintScreen 或 BitBlt 函数时避免闪烁?

任何帮助将不胜感激。

        public Bitmap GetScreenshot(IntPtr ihandle)
    {
        IntPtr hwnd = ihandle;//handle here

        RECT rc;
        FocusWindow(ihandle);
        GetWindowRect(hwnd, out rc);

        Bitmap bmp = new Bitmap(rc.Right - rc.Left, rc.Bottom - rc.Top, PixelFormat.Format32bppArgb);
        Graphics gfxBmp = Graphics.FromImage(bmp);
        IntPtr hdcBitmap;
        try
        {
            hdcBitmap = gfxBmp.GetHdc();
        }
        catch
        {
            return null;
        }
        bool succeeded = PrintWindow(hwnd, hdcBitmap, 0);
        gfxBmp.ReleaseHdc(hdcBitmap);
        if (!succeeded)
        {
            gfxBmp.FillRectangle(new SolidBrush(Color.Gray), new Rectangle(Point.Empty, bmp.Size));
        }
        IntPtr hRgn = CreateRectRgn(0, 0, 0, 0);
        GetWindowRgn(hwnd, hRgn);
        Region region = Region.FromHrgn(hRgn);//err here once
        if (!region.IsEmpty(gfxBmp))
        {
            gfxBmp.ExcludeClip(region);
            gfxBmp.Clear(Color.Transparent);
        }
        gfxBmp.Dispose();
        return bmp;
    }
        public Bitmap CaptureWindowImage(IntPtr hWnd)  //, System.Drawing.Rectangle wndRect)
    {
        IntPtr hWndDc = GetDC(hWnd);
        IntPtr hMemDc = CreateCompatibleDC(hWndDc);
        RECT rc;
        GetWindowRect(hWnd, out rc);

        IntPtr hBitmap = CreateCompatibleBitmap(hWndDc, rc.Width, rc.Height);
        SelectObject(hMemDc, hBitmap);

        BitBlt(hMemDc, 0, 0, rc.Width, rc.Height, hWndDc, 0, 0, TernaryRasterOperations.SRCCOPY);
        Bitmap bitmap = Bitmap.FromHbitmap(hBitmap);

        DeleteObject(hBitmap);
        ReleaseDC(hWnd, hWndDc);
        ReleaseDC(IntPtr.Zero, hMemDc);
        DeleteDC(hMemDc);
        return bitmap;
    }

0 个答案:

没有答案
相关问题