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