Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 桌面背景上的绘图(WIN32)_C++_Winapi - Fatal编程技术网

C++ 桌面背景上的绘图(WIN32)

C++ 桌面背景上的绘图(WIN32),c++,winapi,C++,Winapi,有没有办法在WIN32中绘制桌面背景,并在重新绘制桌面背景时接收通知 我试过这个: desk = GetDesktopWindow(); dc = GetDC(desk); MoveToEx(dc,0,0,NULL); LineTo(dc,1680,1050); ReleaseDC(desk,dc); 但它可以在整个屏幕上绘制,甚至可以在屏幕上的窗口上绘制。只是引用: GetDesktopWindow函数返回 桌面窗口的句柄。这个 桌面窗口覆盖整个屏幕 屏幕。桌面窗口就是这个区域 其他窗口位于

有没有办法在WIN32中绘制桌面背景,并在重新绘制桌面背景时接收通知

我试过这个:

desk = GetDesktopWindow();
dc = GetDC(desk);
MoveToEx(dc,0,0,NULL);
LineTo(dc,1680,1050);
ReleaseDC(desk,dc);
但它可以在整个屏幕上绘制,甚至可以在屏幕上的窗口上绘制。

只是引用:

GetDesktopWindow函数返回 桌面窗口的句柄。这个 桌面窗口覆盖整个屏幕 屏幕。桌面窗口就是这个区域 其他窗口位于哪个窗口之上 画的

因此,您将得到一个带有嵌套窗口的窗口。
我不是一个真正的WIN32用户,但我认为这里的方法是进入较低级别,控制正在绘制背景图片的图形对象,然后在那里绘制。

您可以使用Spy++查找哪个窗口是桌面背景窗口

在我的系统上,我看到以下层次结构:

  • 窗口000100098“程序管理器”程序
    • 窗口0001009E“外壳DLL\u devview
      • 窗口00100A0“FolderView”系统列表视图32
我猜您指的是SysListView32——一个包含所有图标的窗口。您可以使用查找此窗口

编辑 您应该结合使用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;
}

正如您所看到的,窗口句柄完全不同。

我用desk=FindWindowEx(NULL,NULL,L“SysListView32”,NULL)更改了第一行;但我认为它与GetDesktopWindow的窗口相同,因为它具有相同的效果。
Folder View: 000100A0
Desktop Window: 00010014