FFmpeg+MFC动态桌面(一)

蛰伏了半年,啥事也没干成,惨淡~

一直以来比较感兴趣stream上的 Dynamic Wallpaper,现在整好有时间把它搞了搞,打鱼晒网的花了差不多两周,这里总结一下,感兴趣的小伙伴可以参考,这里留作笔记。

项目内核基于FFmpeg+SDL解码音视频,用MFC封装做了个界面,VS2013开发。

目前测试通过 Win7 Win10 Win8未测试。

发布程序大约30M,内存以及CPU占用还可~

talk is cheap,show me the code!

首先了解一下windows桌面:

https://jrhar.blog.csdn.net/article/details/79893134

https://blog.csdn.net/qq_40036189/article/details/108210747

不太懂的小伙伴,可一看看上边这两个博主的文章有个基本的了解,下边我直接上我的桌面捕获代码

Win7 Win10(包含surface)测试有效。

//存在多个分桌面形式,只保留带SHELLDLL_DefView的这个
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
	//根据窗口句柄 获取窗口类名
	CHAR lpClassName[20];
	memset(lpClassName, 0, 20);
	GetClassNameA(hwnd, lpClassName, 20);

	//将非桌面的WorkerW隐藏掉 会存在多个worker 仅保留含有 SHELLDLL_DefView的一个
	if ((strcmp(lpClassName, "WorkerW") == 0) && (!FindWindowEx(hwnd, NULL, "SHELLDLL_DefView", NULL)))
	{
		ShowWindow(hwnd, SW_HIDE);//隐藏掉分屏桌面,关闭会导致界面显示卡顿
	}
	return true;
}


HWND CFSWallerDlg::FindDesktopWnd()
{
	//查找背景显示桌面
	HWND progman = ::FindWindow("Progman", NULL);//Progman
	SendMessageTimeout(progman, 0x052C, 0, 0, SMTO_NORMAL, 1000, nullptr);//发送分屏显示命令
	
	::ShowWindow(progman, SW_NORMAL);//将program显示出来
	
	//枚举窗口,将其余workerw隐藏
	EnumWindows(EnumWindowsProc, NULL);
	return progman;
}

思路就是获取progman这个窗口的句柄,然后在其上创建一个显示子窗口,用来做ffmpeg解码图像的显示屏幕,

如此就实现了桌面的动态显示。下篇写音视频解码显示。

源码链接:https://download.csdn.net/download/qq_36568418/14978664

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值