蛰伏了半年,啥事也没干成,惨淡~
一直以来比较感兴趣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