2009-07-24 44 views
6

WIN32のデスクトップの背景を描画する方法はありますか?また、デスクトップの背景を再描画するときに通知を受け取る方法はありますか?デスクトップの背景に描画する(WIN32)

私はこの試みた:

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

をしかしそれも、画面上にあるウィンドウの上に、画面全体に描画します。

答えて

7

Spy ++を使用して、デスクトップの背景のウィンドウを見つけることができます。私は、次の階層を参照してください、私のシステムで

  • ウィンドウ000100098 "プログラムマネージャ" PROGMAN
    • ウィンドウ0001009E "" SHELLDLL_DefView
      • ウィンドウ00100A0 "FolderView" SysListView32

あなたはSysListView32 - すべてのアイコンが表示されたウィンドウを参照していると思います。 FindWindowExを使用すると、このウィンドウを見つけることができます。

FindWindowExとEnumerateChildWindowsの組み合わせを使用する必要があります。以下に提示するコードは次のようなコマンドライン]ボックスでコンパイルすることができます:ここでは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; 
} 

結果では、ウィンドウハンドルはかなり異なっている見ることができるようにfinddesktop.exe

Folder View: 000100A0 
Desktop Window: 00010014 

を実行した後です。

+0

私はdesk = FindWindowEx(NULL、NULL、L "SysListView32"、NULL)で最初の行を変更します。同じ効果があるので、GetDesktopWindowと同じウィンドウを取得すると思います。 – Razvi

3

だけMSDNを引用:

GetDesktopWindow機能は、デスクトップウィンドウに ハンドルを返します。 デスクトップウィンドウは、 の画面全体をカバーします。デスクトップウィンドウは、他のウィンドウが で塗られている領域の上にある の領域です。

したがって、ネストされたウィンドウを持つウィンドウが表示されます。 私はかなりWIN32のユーザーではありませんが、ここでのアプローチは、より低いレベルに到達し、背景の絵を描いているグラフィックオブジェクトをコントロールしてそこに描画すると思います。

関連する問題