Winapi 如何在win32 C+;中执行BitBlt()以复制包含Windows Media Player的屏幕区域+;编程?

Winapi 如何在win32 C+;中执行BitBlt()以复制包含Windows Media Player的屏幕区域+;编程?,winapi,screenshot,bitblt,Winapi,Screenshot,Bitblt,我有一个通过BitBlt捕获屏幕区域的程序。我今天测试时发现,当屏幕区域包含Windows Media Player的某些部分时,这些部分是灰色的。区域的其余部分成功复制到位图 下面是我用来捕获屏幕一部分的代码片段: HDC hdc = ::GetDC(NULL); // get the desktop device context HDC hDest = CreateCompatibleDC(hdc); // create a device context to use

我有一个通过
BitBlt
捕获屏幕区域的程序。我今天测试时发现,当屏幕区域包含Windows Media Player的某些部分时,这些部分是灰色的。区域的其余部分成功复制到位图

下面是我用来捕获屏幕一部分的代码片段:

    HDC hdc = ::GetDC(NULL); // get the desktop device context
    HDC hDest = CreateCompatibleDC(hdc); // create a device context to use

    // set the height and width of the region
    int height = 800;
    int width = 600;

    // create a bitmap
    HBITMAP hbDesktop = CreateCompatibleBitmap(hdc, width, height);

    // use the previously created device context with the bitmap
    SelectObject(hDest, hbDesktop);

    // copy from the desktop device context (x=100,y=100) to the bitmap device context
    BitBlt(hDest, 0, 0, width, height, hdc, 100, 100, SRCCOPY);
此代码片段捕获从屏幕点(100100)开始的尺寸为800x600的屏幕区域

我把播放电影的媒体播放器放在这个区域的某个地方,当我进入输出位图时,它是一个灰色区域,而不是电影播放器的内容


我想知道如果屏幕区域包含电影播放器,是否可以
BitBlt
?这是因为Media Player在屏幕上显示的内容与其他windows应用程序不同吗?

这是不可能的。媒体播放器(尤其是Windows Media Player)使用视频卡独立于CPU绘制视频(通常解码视频流)。这些图像甚至不在主内存中。DRM在这里也适用

你可以试试


要捕获任何分层窗口,但这不能保证工作。

只是好奇,我可以捕获(Alt-PrtScrn)一个播放示例电影的窗口媒体播放器,因此如果您使用Alt-PrtScrn,您还可以
BitBlt
屏幕区域?或者Alt PrtScrn正在做一些特别的事情?哇,这很有趣。我认为操作系统有一个缓冲区,它包含了屏幕的原样。有时确实如此。不过,对于视频播放器,很多时候媒体播放器数据只存在于图形卡中(操作系统会告诉图形卡在哪里进行叠加);操作系统缓冲区只有(颜色键控)覆盖区域。@EdwardClements-很多时候,覆盖区域的选择取决于视频格式和过滤器布局。如果图形卡不支持视频格式(或媒体播放器选择不将视频解码卸载到图形卡),则视频位于CPU可访问的内存中。带有CAPTUREBLT标志的BitBlt可能会有所帮助,但仍有相当多的情况下,数据根本不存在可复制的位置。
BitBlt(hDest, 0, 0, width, height , hdc, 100, 100, SRCCOPY | CAPTUREBLT);