我在 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 ) ;
我在这里做错什么了吗?
任何帮助都是可观的,在此先感谢。