Render to Desktop - PullRequest
       16

Render to Desktop

4 голосов
/ 18 сентября 2011

Я хочу иметь возможность отображать вещи как обои. Я использую Windows, и я предпочитаю DirectX. Я знаю, что VLC может рендерить видео с обоями в режиме DirectX, так что это возможно.

Итак, быстрый вопрос: как я могу установить цель рендеринга для рендеринга, как если бы это были обои в Windows?

1 Ответ

2 голосов
/ 18 сентября 2011

Вот некоторый код, который даст вам дескриптор (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 с регионами значков рабочего стола. Их можно найти, немного поработав с окном управления списком рабочего стола. Это довольно сложно и, возможно, не по теме для этого вопроса.

...