3

我在 Windows 10 上使用 BitBlt / StretchBlt API 捕获图像,这取决于是否需要缩放屏幕。每当我捕获未配置为主显示器的第二台显示器时,似乎有一种奇怪的行为,即捕获的屏幕的前半部分是屏幕后半部分的复制品。这平均每 10 个图像随机发生一次。

我在互联网上找不到与这种奇怪问题相关的任何文件。我什至没有做任何多线程。捕获频率可能有问题吗?但这看起来甚至没有意义,因为每当我将显示器设置为主显示器时,屏幕捕获都没有问题。

这是原始图像

原始图像

捕获的图像

捕获的图像

监视器对齐

显示器对齐

注意: 到目前为止,只有当前景窗口为 Notepad++ 时,我才能重现该问题。我不确定其他应用程序是否也会出现此问题。,我不能采用基于 directX 的方法,因为该程序也必须在 WindowsXP 上运行。

这是代码的摘录:

HDC memDC = CreateCompatibleDC ( hDC ) ;

HBITMAP previousImage = ( HBITMAP ) SelectObject ( memDC , curImage ) 

if ( ( previousImage ) == NULL )
{
    return -1;
}

BOOL blitok ;

if ( lf_ImageScalingFactor != (double)1.0 )
{
    SetStretchBltMode ( memDC , HALFTONE ) ;

    if ( capture_all )
    {
        blitok = StretchBlt ( memDC , 0 , 0 , (int)(clientwindow.Width () ) , (int) (clientwindow.Height () ), 
            hDC , clientwindow.left - (physicalscreenrect.left * lf_ImageScalingFactor), clientwindow.top - (physicalscreenrect.top * lf_ImageScalingFactor), physicalscreenrect.Width(), physicalscreenrect.Height(), SRCCOPY | CAPTUREBLT ) ;
    }
    else
    {
        blitok = StretchBlt ( memDC , 0 , 0 , (int)(clientwindow.Width ()) , (int)(clientwindow.Height ()), 
                hDC , clientwindow.left - (physicalscreenrect.left * lf_ImageScalingFactor), clientwindow.top - (physicalscreenrect.top * lf_ImageScalingFactor),physicalscreenrect.Width(), physicalscreenrect.Height(), SRCCOPY ) ;
    }
}
else
{
    if ( capture_all )
    {
        blitok = BitBlt ( memDC , 0 , 0 , clientwindow.Width (), clientwindow.Height (), 
                hDC , clientwindow.left - physicalscreenrect.left , clientwindow.top - physicalscreenrect.top , SRCCOPY | CAPTUREBLT ) ;
    }
    else
    {
        blitok = BitBlt ( memDC , 0 , 0 , clientwindow.Width (), clientwindow.Height (), 
                hDC , clientwindow.left - physicalscreenrect.left , clientwindow.top - physicalscreenrect.top , SRCCOPY ) ;
    }

}

SelectObject ( memDC , previousImage ) ;

DeleteDC ( memDC ) ;
DeleteDC ( hDC ) ;

我在这里做错什么了吗?

任何帮助都是可观的,在此先感谢。

4

0 回答 0