渲染到桌面

我想能够渲染一个东西,就好像它是一个壁纸。 我使用Windows,我更喜欢DirectX。 我知道VLC可以渲染video在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 。 这些可以在桌面的列表视图控制窗口中找到一些工作。 这是相当复杂的,也许是这个问题的主题。