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