4
我希望能夠渲染一個東西,就好像它是一個壁紙。我使用Windows,我更喜歡DirectX。我知道VLC可以渲染視頻在DirectX模式下有壁紙,所以這是可能的。渲染到桌面
所以,一個簡單的問題,我如何設置rendertarget渲染,如果它是Windows中的牆紙?
我希望能夠渲染一個東西,就好像它是一個壁紙。我使用Windows,我更喜歡DirectX。我知道VLC可以渲染視頻在DirectX模式下有壁紙,所以這是可能的。渲染到桌面
所以,一個簡單的問題,我如何設置rendertarget渲染,如果它是Windows中的牆紙?
下面是一些代碼,它將爲您提供一個句柄(HWND)給一個可用於在Windows桌面上繪製的窗口。這是如何工作的主要問題是桌面圖標仍然存在,但這將允許您繪製它們的頂部。如果你想讓圖標像正常一樣出現(把你的東西放在它們後面),你需要在繪製完東西后重新繪製它們,或者找到一種方法避免在第一時間繪製它們。這是相當不平凡的事情,我從來沒有完全解決。
這絕對適用於XP和Windows 7(使用Areo)獲取正常GDI繪圖可以使用的內容。我從來沒有用DirectX測試過它,但我懷疑它會工作,如果你使用hMainWnd作爲演示窗口。
HWND hProgMan = NULL;
HWND hShell = NULL;
HWND hMainWnd = NULL;
unsigned int ScreenWidth = 0;
unsigned int ScreenHeight = 0;
int ScreenTop = 0;
int ScreenLeft = 0;
HRGN ValidRGN = NULL;
// ...
ScreenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
if (ScreenWidth == 0)
ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
ScreenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN);
if (ScreenHeight == 0)
ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
ScreenTop = GetSystemMetrics(SM_YVIRTUALSCREEN);
ScreenLeft = GetSystemMetrics(SM_XVIRTUALSCREEN);
ValidRGN = CreateRectRgn(0,0,ScreenWidth,ScreenHeight);
hProgMan = FindWindow("Progman", "Program Manager");
if(hProgMan != NULL)
{
hShell = FindWindowEx(hProgMan, 0, "SHELLDLL_DefView", NULL);
}
else
{
hProgMan = FindWindow("DesktopBackgroundClass", NULL);
if(hProgMan != NULL)
hShell = FindWindowEx(hProgMan, 0, "DeskFolder", NULL);
}
hMainWnd = CreateWindowEx(WS_EX_TRANSPARENT, "MyWindowClass", "Window Title", WS_CHILDWINDOW | WS_OVERLAPPED | WS_CLIPCHILDREN, 0,0,ScreenWidth,ScreenHeight, hShell,NULL,hInstance,NULL);
EnableWindow(hMainWnd,FALSE);
SetWindowPos(hMainWnd,HWND_BOTTOM,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
...然後繪製(使用GDI),這樣的事情...
HDC hDC = GetDC(hMainWnd);
SelectClipRgn(hDC,ValidRGN);
BitBlt(hDC, 0, 0, ScreenX, ScreenY, hBackBuffer, 0, 0, SRCCOPY);
ReleaseDC(hMainWnd, hDC);
...和更新ValidRGN
用的桌面圖標的區域。這些可以在桌面的listview控制窗口中找到一些工作。這是相當複雜的,也許是這個問題的主題。
嗯,我希望它的行爲像一個普通的壁紙會做的,有圖標。無論如何,我會看看你的代碼,看看是否有東西可以做到把它放在圖標後面。謝謝。 – user950760
它看起來像你可以從桌面抓取DC並繪製到它:http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/5700adf8-5c47-404f-8741-600643442449而不創建一個孩子的窗戶。該線程中的作者無法在該DC上使用Direct3D,但您應該能夠呈現到隱藏窗口,捕獲結果,然後將其粘貼到桌面。 – IronMensan