1、效果展示
2、原理及框架
2.1 核心思想
Windows的桌面背景通常由壁纸图片组成。但是允许应用程序以窗口的形式在桌面上显示内容。这使得视频播放器等应用程序可以创建一个窗口,并将视频内容显示在其中,通过调整桌面与应用程序的层叠顺序,将视频播放窗口置于其他窗口的上方,视频内容就可以覆盖在桌面上,从而让视频内容呈现在桌面上。
2.2 windows操作系统的窗口管理机制
- 窗口句柄: 在Windows中,每个窗口都有一个唯一的标识符,称为窗口句柄(Window Handle)。窗口句柄是一个32位的数值,用于唯一标识一个窗口,并允许系统和应用程序对其进行操作。
- 消息传递机制: Windows使用消息传递机制来处理窗口事件和用户输入。当用户执行操作(如点击鼠标、按键盘按键等)时,操作系统会将相应的消息发送给与之关联的窗口。窗口通过处理这些消息来响应用户输入、更新界面内容等。
- 窗口过程: 每个窗口都有一个与之相关联的窗口过程,也称为消息处理函数。窗口过程是一个回调函数,它接收并处理窗口消息。当窗口接收到消息时,系统会调用相应窗口的窗口过程来处理消息。
- 窗口状态: 窗口可以处于不同的状态,如激活状态、非激活状态、最小化状态、最大化状态等。窗口管理器负责跟踪和管理窗口的状态,并根据需要进行相应的状态转换。
- 窗口布局: Windows窗口管理器负责确定窗口在屏幕上的位置和大小。用户可以通过拖动窗口边框或使用窗口管理器提供的接口来调整窗口的大小和位置。
- 焦点管理: 窗口管理器会跟踪当前拥有焦点(即接收用户输入)的窗口,并根据用户操作来更新焦点。用户可以通过点击窗口或使用键盘操作来改变焦点所在的窗口。
- Z-order: 窗口管理器维护了一个窗口的Z-order,确定了窗口在屏幕上的层叠顺序。Z-order决定了哪些窗口显示在其他窗口的上方。窗口管理器根据窗口的Z-order和显示状态来决定窗口的绘制顺序。
3、核心代码
void BaseControl::videoPlayer(const QString& videoURL)
{
videoWidget->setWindowFlag(Qt::FramelessWindowHint);
playlist->clear();
playlist->addMedia(QUrl::fromLocalFile(videoURL));
//播放列表加入视频
videoWidget->setAspectRatioMode(Qt::IgnoreAspectRatio);//视频填充整个窗口
player->setVideoOutput(videoWidget);//播放器设置播放窗口
player->setPlaylist(playlist);//播放器导入播放列表
videoWidget->setFullScreen(true);//全屏
playlist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);//播放列表设置循环播放
SetParent((HWND)videoWidget->winId(), Utils::GetWorkerW());
//将视频句柄附加到桌面句柄上
player->play();
QObject::connect(player,&QMediaPlayer::positionChanged,[&](qint64 t){
if(t>=9000)
{
player->setPosition(10);
player->play();
}
});//通过信号槽设置AB循环,防止出现黑影
videoWidget->show();
}