整理一下可以实现动态桌面的方案。
1. qt
qt使用QMediaPlayer播放视频,对于mp4等视频依赖解码后端,比如ffmpeg,需要编译multimedia_backend_ffmpeg
2. ffmpeg+kanzi 3.6
编译ffmpeg比较困难,可去官网下载,一般是x86版本,所以不要用kanzi 3.9(64位)
ffmpeg-5.1.2-full_build-shared 稳定
ffmpeg-8.0.1-full_build-shared 最新
3. gstreamer + glfw + opengl
https://gstreamer.freedesktop.org/download
可以选择32-bit
MSVC 32-bit (VS 2019, Release CRT)
- 1.26.10 runtime installer
- 1.26.10 development installer
glfw + opengl封装成了2d引擎 自制2d游戏引擎
gst-plugins 发布
exe旁放gst-plugins文件夹,里面有
glib-2.0-0.dll
gobject-2.0-0.dll
gstapp-1.0-0.dll
gstreamer-1.0-0.dll
gstvideo-1.0-0.dll
程序支持播放视频后,再把窗口设置为windows桌面的子窗口就行。
c
if (isDesktop) {
SendMessageToDesktop();//发送消息
Sleep(100); // 2. 稍微等一下(可选,防止系统还没反应过来)
HWND desktopWnd = findDesktopIconWnd();//获取桌面句柄
if (desktopWnd)
{
GetWindow().SetIsDesktopFlag(true);
HWND hwndGLFW = GetWindow().GetNativeWindowID();
CC_INFO("Window handle: %p \n", hwndGLFW);
SetParent(hwndGLFW, desktopWnd);
int screenW = GetSystemMetrics(SM_CXSCREEN);
int screenH = GetSystemMetrics(SM_CYSCREEN);
// 设置窗口大小和位置,并确保窗口在 WorkerW 下方
SetWindowPos(hwndGLFW,
HWND_BOTTOM,
0, 0,
screenW, screenH,
SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_SHOWWINDOW);
}
else {
exit(0);
}
}