渲染到桌面

use*_*760 5 c++ windows directx rendering wallpaper

我希望能够渲染出好像墙纸一样的东西。我使用Windows,并且更喜欢DirectX。我知道VLC可以在DirectX模式下渲染具有墙纸的视频,因此这是可能的。

因此,一个简单的问题是:如何将rendertarget设置为像Windows中的墙纸一样进行渲染?

Soa*_*Box 2

下面是一些代码,它们将为您提供一个窗口的句柄(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);
Run Code Online (Sandbox Code Playgroud)

...然后进行绘图(使用 GDI),像这样...

    HDC hDC = GetDC( hMainWnd );
    SelectClipRgn(hDC,ValidRGN);
    BitBlt( hDC, 0, 0, ScreenX, ScreenY, hBackBuffer, 0, 0, SRCCOPY );
    ReleaseDC( hMainWnd, hDC );
Run Code Online (Sandbox Code Playgroud)

...并更新ValidRGN桌面图标的区域。通过对桌面的列表视图控制窗口进行一些操作就可以找到这些内容。这是相当复杂的,可能与这个问题无关。