有什么方法可以在WIN32上绘制桌面背景,并且在重新绘制桌面背景时也会收到通知?

我尝试了这个:

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

但是,即使在屏幕上的窗口上,它也会绘制在整个屏幕上。

最佳答案

您可以使用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
    

    如您所见,窗口句柄有很大的不同。

    08-06 00:15