gpt4 book ai didi

c++ - QPixmap 不抓取 Web 浏览器窗口

转载 作者:行者123 更新时间:2023-11-30 05:11:31 26 4
gpt4 key购买 nike

当我在网络浏览器窗口中使用 QPixmap::GrabWindow(WId) 时,它只返回黑屏。

我正在使用以下代码:

QScreen *screen = QGuiApplication::primaryScreen();
m_pixmap = screen->grabWindow(hW);
m_image = m_pixmap.toImage();
m_image.save("p.png");

当我打开“p.png”时,它只是黑色图片。与其他窗口一起使用时效果很好。

如何获取浏览器的正常画面?

最佳答案

事实是QScreen::grabWindow 使用Windows GDI捕捉图像。这是一个相当古老的 API,由没有硬件加速的程序使用(由处理器绘制)。还有chrome-软件不古早用Windows DXGI画的.

我已经编写了使用该技术的软件。已发布示例代码 here .准备用MSVC编译器在Qt 5.10库上编译,貌似没有什么区别,2015年还是2017年。我的机器是64位的,也许这个也很重要。

введите сюда описание изображения

里面有两个类:FrameBroadcast 和 FrameCapturer。 FrameBroadcast 向 FrameCapturer 请求一定时间间隔的屏幕截图,并通过信号 void frameCaptured (QSharedPointer <Frame> frame); 发送给订阅者。一旦超出所有插槽处理程序的范围,QSharedPointer 就会自动删除为屏幕内容分配的内存。

#include <QApplication>
#include <QObject>
#include <QPixmap>
#include <QImage>
#include <QDialog>
#include <QLabel>

#include "framebroadcast.h"

/*static Frame* CopyFrame(const Frame *incomingFrame)
{
Frame *frame = new Frame();
frame->width=incomingFrame->width;
frame->height=incomingFrame->height;
frame->lenght=incomingFrame->lenght;
frame->buffer=new unsigned char[frame->lenght];

std::memcpy(frame->buffer,incomingFrame->buffer,frame->lenght);
return frame;
}

static Frame* CopyFrame(const QSharedPointer<Frame> &incomingFrame)
{
return CopyFrame(incomingFrame.data());
}*/


int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QDialog *dialog = new QDialog();
QLabel *label = new QLabel(dialog);

FrameBroadcast *cast = new FrameBroadcast();
QObject::connect(cast, &FrameBroadcast::frameCaptured, [=](const QSharedPointer<Frame> &frame) {

int w = static_cast<int>(frame.data()->width);
int h = static_cast<int>(frame.data()->height);

QImage img(frame.data()->buffer,w,h,QImage::Format_RGBA8888);
label->setPixmap(QPixmap::fromImage(img));
label->resize(w,h);

qDebug() << "Update";
});
cast->startCapture();

dialog->show();

return app.exec();
}

在 main.cpp 中,创建了一个简单的对话框,显示捕获的结果。为了以防万一,如果不可能将所有操作都放在一个槽中,我附上了一个代码,可以从 QSharedPointer 中解开屏幕内容。它紧跟在包含和注释掉之后。

#pragma comment(lib,"dxgi.lib")
#pragma comment(lib,"D3D11.lib")
#pragma comment(lib,"Shcore.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"windowscodecs.lib")
#pragma comment (lib, "user32.lib")
#pragma comment (lib, "dxguid.lib")

详细解析代码没有意义。它太大了,但不难 retrofit 以适应您的需要。值得注意的是,使用了“Auto-linking”- Microsoft 编译器功能:必要的库将在编译时自动启动(查看 framecapturer.h)

关于c++ - QPixmap 不抓取 Web 浏览器窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44998473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com