【音视频】使用PrintWindow实现程序窗口采集(4-3)

本文探讨了在ffmpeg gdigrab效果不佳的情况下,转向使用PrintWindow技术进行窗口截图的实践。介绍了初始化采集器、开启采集、结束采集的步骤,并分享了使用PrintWindow采集窗口的心得体会,指出该方法能有效捕获包括标题栏在内的完整窗口区域。
摘要由CSDN通过智能技术生成

由于使用ffmpeg gdigrab采集程序窗口效果不太好,于是又研究了一下新的窗口截图技术,该篇文章总结一下使用PrintWindow对窗口截流的心得。

1、初始化采集器

如果采集的窗口最小化,先将其显示出来,然后通过GetWindowRect获取窗口大小,PrintWindow可以截取窗口的全部区域(包括客户区域和标题区域)

int GdiCaptor::init(const std::string& deviceId, const int fps)
{
   
	int err = ERROR_CODE_OK;
	if (m_inited) {
   
		return err;
	}

	do {
   
		HWND hwnd = reinterpret_cast<HWND>(atol(deviceId.c_str()));
		if (hwnd == nullptr) {
   
			err = ERROR_CODE_PARAMS_ERROR;
			break;
		}

		// 将最小化窗口显示出来
		if (::IsIconic(hwnd)) {
   
			::ShowWindow(hwnd, SW_SHOWNOACTIVATE);
		}

		RECT rect = {
   };
		::GetWindowRect(hwnd, &rect);
		m_srcDc = ::GetWindowDC(hwnd);
		m_memDc = ::CreateCompatibleDC(m_srcDc);
		m_deviceId = deviceId;
		m_rect = rect;
		m_fps = fps;
		m_pixelFmt = AV_PIX_FMT_BGRA;

		m_inited = true;
	} while (0);

	if (err != ERROR_CODE_OK) {
   
		LOGGER::Logger::log(LOGGER::LOG_TYPE_ERROR, "[%s] init vstream captor error: %s, last error: %lu",
			__FUNCTION__, HCMDR_GET_ERROR_DESC(err), GetLastError());
		cleanup();
	}

	return err;
}

2、开启采集

int GdiCaptor::start()
{
   
	int err = ERROR_CODE_OK;

	if (m_running)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值