有沒有電腦做兼職的網(wǎng)站嗎流量查詢網(wǎng)站
文章目錄
- 前言
- 效果展示
- 為什么要做他
- 如何實(shí)現(xiàn)他
- 實(shí)現(xiàn)步驟
- 獲取桌面句柄
- 代碼獲取桌面句柄
- libvlc_media_player_set_hwnd函數(shù)
- 動(dòng)態(tài)壁紙代碼
- 總結(jié)
前言
在當(dāng)今的數(shù)字世界中,個(gè)性化和自定義化的體驗(yàn)越來越受到人們的歡迎。動(dòng)態(tài)壁紙是其中一種很受歡迎的方式,它不僅可以美化桌面,還能帶來生動(dòng)的視覺體驗(yàn)。利用開源的 VLC 媒體播放器庫(libVLC)和 C++,我們可以輕松地創(chuàng)建一個(gè)獨(dú)特的動(dòng)態(tài)壁紙程序,將視頻內(nèi)容直接嵌入到 Windows 的桌面背景中。本篇文章將帶你一步步實(shí)現(xiàn)這個(gè)目標(biāo),通過使用 libVLC 的強(qiáng)大功能,將視頻作為動(dòng)態(tài)壁紙展示在你的桌面上。
效果展示
為什么要做他
- 用來訓(xùn)練我們使用VLC播放的能力
- 我們可以自定義壁紙(雖然wallpaper engine也可以實(shí)現(xiàn)這個(gè)能力,但是需要購(gòu)買難免是比較心疼的)
如何實(shí)現(xiàn)他
在Windows里面,我們的壁紙其實(shí)就和一個(gè)窗口差不多,他也有句柄,我們得到他的句柄,然后把視頻貼上去就OK了
在VLC中,我們可以使用libvlc_media_player_set_hwnd
這個(gè)函數(shù)把播放的視頻貼到一個(gè)指定的句柄上
那么我們的目標(biāo)很明確了:
- 獲取句柄
- 把視頻貼上去
實(shí)現(xiàn)步驟
獲取桌面句柄
在 Windows 系統(tǒng)中,桌面其實(shí)是由幾個(gè)不同的部分組成的。這些部分就像樹枝一樣,一層一層地構(gòu)成了整個(gè)桌面。
-
父窗口:這是整個(gè)桌面的基礎(chǔ),它就像樹干一樣,支撐著其他部分。這個(gè)父窗口在 Windows 中叫做 “Program Manager”(Progman)。
-
背景:這是你在桌面上看到的圖片或顏色,是桌面的底層部分,就像樹的枝葉一樣覆蓋在整個(gè)桌面上。
-
圖標(biāo):這些是你桌面上看到的各種文件、文件夾和應(yīng)用程序的快捷方式,它們顯示在背景之上。
在 Windows 系統(tǒng)中,“Program Manager” 包含了一個(gè)叫做 “SysListView32” 的窗口,這個(gè)窗口專門用來顯示桌面上的圖標(biāo)。
如果你能把自己(比如說一個(gè)應(yīng)用程序或窗口)設(shè)置在 “Program Manager” 的這個(gè) “SysListView32” 窗口后面,那么你的窗口就會(huì)出現(xiàn)在桌面圖標(biāo)的后面,就好像你躲在樹葉后面一樣。
所以,整個(gè)意思是:桌面是由父窗口、背景和圖標(biāo)這三部分組成的,而通過設(shè)置父窗口(Program Manager),你可以控制自己窗口的顯示位置,從而把它放在桌面圖標(biāo)的后面。
代碼獲取桌面句柄
我們使用的是Windows的API你先要包含windows.h
HWND FindDTWindow()
{// 找到名為 "Progman" 的頂級(jí)窗口句柄,它的窗口標(biāo)題是 "Program Manager"HWND hWnd = ::FindWindow(L"Progman", L"Program Manager");// 發(fā)送一個(gè)特殊的消息 (0x052C) 給找到的 "Progman" 窗口// 這條消息會(huì)使 Windows 創(chuàng)建一個(gè)新的 WorkerW 窗口DWORD_PTR dResult = 0;SendMessageTimeout(hWnd, 0x052C, 0, NULL, SMTO_NORMAL, 1000, &dResult);// 聲明一個(gè)變量來存儲(chǔ) WorkerW 窗口的句柄HWND hwndWorkW = NULL;// 使用一個(gè) do-while 循環(huán)來查找 WorkerW 窗口do {// 查找下一個(gè) WorkerW 窗口hwndWorkW = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);if (NULL == hwndWorkW)continue;// 在 WorkerW 窗口中查找 SHELLDLL_DefView 窗口HWND hView = ::FindWindowEx(hwndWorkW, NULL, L"SHELLDLL_DefView", NULL);if (NULL == hView)continue;// 如果找到了 SHELLDLL_DefView 窗口,則嘗試關(guān)閉多余的 WorkerW 窗口HWND h = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);while (NULL != h) {SendMessage(h, WM_CLOSE, 0, 0);h = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);}break;} while (true);// 返回 "Progman" 窗口的句柄return hWnd;
}
libvlc_media_player_set_hwnd函數(shù)
libvlc_media_player_set_hwnd
是 libVLC 庫中的一個(gè)函數(shù),用于設(shè)置視頻輸出窗口的句柄 (HWND)。這是在 Windows 平臺(tái)上使用 libVLC 播放視頻時(shí)常用的函數(shù)。
void libvlc_media_player_set_hwnd(libvlc_media_player_t *p_mi, void *drawable);
函數(shù)作用:
這個(gè)函數(shù)的主要作用是將視頻輸出重定向到指定的窗口。換句話說,當(dāng)你使用 libVLC 播放視頻時(shí),可以指定一個(gè)窗口,讓視頻顯示在該窗口中。
參數(shù)和含義:
-
libvlc_media_player_t *p_mi
:這是一個(gè)指向 libVLC 媒體播放器實(shí)例的指針。你需要先創(chuàng)建一個(gè)媒體播放器實(shí)例,然后將它的指針傳遞給這個(gè)函數(shù)。 -
void *drawable
:這是一個(gè)指向窗口句柄 (HWND) 的指針。在 Windows 平臺(tái)上,這個(gè)句柄指向你希望視頻輸出的窗口。
動(dòng)態(tài)壁紙代碼
#include <iostream>// 避免 ssize_t 引發(fā)的錯(cuò)誤
#if defined(_MSC_VER)
#include <basetsd.h>
typedef SSIZE_T ssize_t;
#endif#include <vlc/vlc.h>
#include <thread>
#include <Windows.h>using namespace std;HWND FindDTWindow()
{HWND hWnd = ::FindWindow(L"Progman", L"Program Manager");DWORD_PTR dResult = 0;SendMessageTimeout(hWnd, 0x052C, 0, NULL, SMTO_NORMAL, 1000, &dResult);HWND hwndWorkW = NULL;do {hwndWorkW = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);if (NULL == hwndWorkW)continue;HWND hView = ::FindWindowEx(hwndWorkW, NULL, L"SHELLDLL_DefView", NULL);if (NULL == hView)continue;HWND h = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);while (NULL != h) {SendMessage(h, WM_CLOSE, 0, 0);h = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);}break;} while (true);return hWnd;
}// 等待播放結(jié)束(完整播放)
void waitPlaying(libvlc_media_player_t* mp)
{libvlc_state_t state;do {state = libvlc_media_player_get_state(mp);} while (state != libvlc_Error && state != libvlc_Ended);
}void playerMedia(const char* path)
{libvlc_instance_t* vlc = libvlc_new(0, NULL);libvlc_media_t* md = libvlc_media_new_path(vlc, path);//libvlc_media_new_location(vlc, path);libvlc_media_player_t* mp = libvlc_media_player_new_from_media(md);libvlc_media_player_set_media(mp, md);HWND hWnd = FindDTWindow();// 設(shè)置句柄libvlc_media_player_set_hwnd(mp, hWnd);// 開始播放libvlc_media_player_play(mp);// 等待播放結(jié)束waitPlaying(mp);// 釋放資源libvlc_media_release(md);libvlc_media_player_release(mp);libvlc_release(vlc);
}int main()
{playerMedia("./a5.mp4"); //RTSP、HTTP ...;return 0;
}
總結(jié)
通過本文的講解,我們成功地利用 C++ 和 libVLC 創(chuàng)建了一個(gè)獨(dú)特的動(dòng)態(tài)壁紙程序。這個(gè)程序不僅能美化你的桌面,還能為你帶來全新的視覺享受。libVLC 提供了強(qiáng)大的多媒體處理能力,而 C++ 的靈活性則使我們能夠充分利用這些功能,實(shí)現(xiàn)高度自定義的應(yīng)用程序。希望通過本文,你不僅學(xué)會(huì)了如何使用 libVLC 和 C++ 創(chuàng)建動(dòng)態(tài)壁紙,還能激發(fā)更多關(guān)于個(gè)性化桌面體驗(yàn)的創(chuàng)意和想法。讓你的桌面更加生動(dòng),展示屬于你的獨(dú)特風(fēng)格。