2

我有一个程序可以通过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);

此代码片段从屏幕点 (100, 100) 开始捕获尺寸为 800x600 的屏幕区域。

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

我想知道如果BitBlt它包含电影播放器​​,是否有可能是一个屏幕区域?是因为媒体播放器在屏幕上显示的内容与其他 Windows 应用程序不同吗?

4

1 回答 1

1

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

你可以试试

BitBlt(hDest, 0, 0, width, height , hdc, 100, 100, SRCCOPY | CAPTUREBLT);

捕获任何分层窗口,但这不能保证有效。

于 2013-08-11T00:42:16.603 回答