我想获取windows桌面壁纸的位图数据。 而且,我想直接在位图上绘制一些文字。
首先,我尝试通过以下代码获取位图数据。
#include <windows.h>
#include <Commctrl.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev,
LPSTR cmdLine, int showCmd)
{
CoInitialize(NULL);
// find Progman
HWND hProgman = FindWindow("Progman", "Program Manager");
// find DefView
HWND hDefView = FindWindowEx(hProgman, NULL, "SHELLDLL_DefView", NULL);
// find SysListView
HWND hListView = FindWindowEx(hDefView, NULL, "SysListView32", NULL);
char filename[512] = {0};
LVBKIMAGE lvbki;
lvbki.ulFlags = LVBKIF_SOURCE_HBITMAP;
lvbki.hbm = NULL;
lvbki.pszImage = filename;
lvbki.cchImageMax = 512;
lvbki.xOffsetPercent = 0;
lvbki.yOffsetPercent = 0;
int ret = ListView_GetBkImage(hListView, &lvbki);
if (ret == 0) {
MessageBox(NULL, TEXT("GetBkImage failed!"), TEXT("err"), 0);
return -1;
}
if (lvbki.hbm == NULL){
MessageBox(NULL, TEXT("hbm is NULL"), TEXT("err"), 0);
return -1;
}
MessageBox(NULL, TEXT("FINISHED"), TEXT("msg"), 0);
CoUninitialize();
return 0;
}
此代码的结果是“hbm为NULL”。 这是错误的代码?
我的问题是如何获取在SysListView32上显示为桌面墙纸的位图数据? 而且,有可能吗?
问候。
答案 0 :(得分:1)
要直接在桌面上绘图,您不需要获取桌面位图数据,而是桌面设备上下文(DC)。
您应该使用GetDesktopWindow()来检索桌面窗口的句柄,而不是使用FindWindow('SysListView32', nil);
(类名可能在将来更改),然后使用GetDC()来检索桌面窗口的设备上下文(DC)。
您可以使用TextOut(),DrawText()或DrawTextEx()进行文字绘制。
最后,致电ReleaseDC()以释放桌面DC,将其释放以供其他应用程序使用。
例如:
deskhwnd := GetDesktopWindow();
deskhdc := GetDC(deskhwnd);
// Here code where you draw text to the desktop
ReleaseDC(deskhwnd, deskhdc);
但是,如果您确实需要将桌面位图数据(壁纸)用于其他目的,请阅读Wallpaper
中HKCU\Control Panel\Desktop
的值。 Wallpaper值指定存储屏幕背景位图的文件的名称。在Windows Vista及更高版本中,壁纸可以是BMP
或JPG
文件,因此不要使用LoadImage()
API函数来加载壁纸,您应该使用CImage
或GDI+
,假设你使用VC ++。