我希望能够渲染一个像壁纸一样的东西.我使用
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.通过Desktop的listview控制窗口可以找到一些工具.对于这个问题,这个问题相当复杂.