绘制桌面背景(WIN32)
问题描述:
有没有什么办法可以在桌面背景上绘制WIN32并且在桌面背景重新绘制时也收到通知?绘制桌面背景(WIN32)
我尝试这样做:
desk = GetDesktopWindow();
dc = GetDC(desk);
MoveToEx(dc,0,0,NULL);
LineTo(dc,1680,1050);
ReleaseDC(desk,dc);
但它绘制在整个屏幕上,甚至超过那些在屏幕上的窗口。
答
您可以使用Spy ++来查找哪个窗口是桌面背景窗口。
在我的系统我看到以下层次:
- 窗口000100098 “项目经理” 普罗格曼
- 窗口0001009E “” SHELLDLL_DefView
- 窗口00100A0 “文件夹视图” SysListView32
- 窗口0001009E “” SHELLDLL_DefView
我想你是指的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
运行后,正如你所看到的窗口句柄有很大的不同。
答
只是引述MSDN:
的GetDesktopWindow函数返回 的句柄桌面窗口。 桌面窗口覆盖整个 屏幕。桌面窗口是 的区域,在其上面绘制了其他窗口 。
所以你得到一个窗口上嵌套窗口。 我不是一个WIN32用户,但我认为这里的方法已经到了较低的层次,掌握绘制背景图片的图形对象,并在那里绘制。
我用desk = FindWindowEx(NULL,NULL,L“SysListView32”,NULL)更改第一行;但我认为它与GetDesktopWindow获得相同的窗口,因为它具有相同的效果。 – Razvi 2009-07-24 09:20:26