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