2009-07-24 10 views
6

Czy istnieje sposób na rysowanie na tle pulpitu w WIN32, a także otrzymywanie powiadomień, gdy tło pulpitu zostanie przemalowane?Rysunek na tle pulpitu (WIN32)

Próbowałem to:

desk = GetDesktopWindow(); 
dc = GetDC(desk); 
MoveToEx(dc,0,0,NULL); 
LineTo(dc,1680,1050); 
ReleaseDC(desk,dc); 

Ale to opiera się na całym ekranie, nawet w oknach, które są wyświetlane na ekranie.

Odpowiedz

7

Możesz użyć Spy ++, aby znaleźć okno, które jest tłem pulpitu.

W moim systemie widzę następującą hierarchię:

  • Okno 000100098 "Program Manager" Progman
    • Okno 0001009E "" SHELLDLL_DefView
      • Okno 00100A0 "folderview" SysListView32

Podejrzewam, że odnosisz się do SysListView32 - okna ze wszystkimi ikonami. Aby znaleźć to okno, możesz użyć numeru FindWindowEx.

Edycja Powinieneś używać kombinacji FindWindowEx i EnumerateChildWindows. Kod przedstawiony poniżej mogą być zestawiane w oknie wiersza poleceń tak: cl /EHsc finddesktop.cpp /DUNICODE /link user32.lib

#include <windows.h> 
#include <iostream> 
#include <string> 

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) 
{ 
    std::wstring windowClass; 
    windowClass.resize(255); 

    unsigned int chars = ::RealGetWindowClass(hwnd, &*windowClass.begin(), windowClass.size()); 
    windowClass.resize(chars); 

    if (windowClass == L"SysListView32") 
    { 
    HWND* folderView = reinterpret_cast<HWND*>(lParam); 
    *folderView = hwnd; 

    return FALSE; 
    } 

    return TRUE; 
} 

int wmain() 
{ 
    HWND parentFolderView = ::FindWindowEx(0, 0, L"Progman", L"Program Manager"); 
    if (parentFolderView == 0) 
    { 
    std::wcout << L"Couldn't find Progman window, error: 0x" << std::hex << GetLastError() << std::endl; 
    } 

    HWND folderView = 0; 
    ::EnumChildWindows(parentFolderView, EnumChildProc, reinterpret_cast<LPARAM>(&folderView)); 

    if (folderView == 0) 
    { 
    std::wcout << L"Couldn't find FolderView window, error: 0x" << std::hex << GetLastError() << std::endl; 
    } 
    HWND desktopWindow = ::GetDesktopWindow(); 

    std::wcout << L"Folder View: " << folderView << std::endl; 
    std::wcout << L"Desktop Window: " << desktopWindow << std::endl; 

    return 0; 
} 

Oto wyniki po uruchomieniu finddesktop.exe

Folder View: 000100A0 
Desktop Window: 00010014 

Jak widać klamki okienne są zupełnie inne.

+0

Zmieniam pierwszą linię za pomocą desk = FindWindowEx (NULL, NULL, L "SysListView32", NULL); ale myślę, że dostaje to samo okno co GetDesktopWindow, ponieważ ma ten sam efekt. – Razvi

3

Wystarczy przytoczyć MSDN:

Funkcja GetDesktopWindow zwraca uchwyt do okna pulpitu. Okno pulpitu obejmuje cały ekran . Okno na pulpicie to obszar , na którym malowane są inne okna.

Otrzymujesz okno z zagnieżdżonymi oknami. Nie jestem całkiem użytkownikiem WIN32, ale myślę, że podejście tutaj polega na przejściu na niższy poziom, przejęciu kontroli nad obiektem graficznym, który maluje obraz tła, i rysowania tam.