0

我想获取 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 上显示为桌面墙纸的位图数据?而且,有可能吗?

问候。

4

1 回答 1

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);

但是,如果您确实需要获取桌面位图数据(壁纸)以用于其他目的,请阅读Wallpaperin的值HKCU\Control Panel\Desktop壁纸值指定存储屏幕背景位图的文件的名称。在 Windows Vista 及更高版本中,壁纸可以是BMPJPG文件,所以不要使用LoadImage()API 函数加载壁纸,你应该使用CImageorGDI+代替,假设你使用 VC++。

笔记

@Remy Lebeau 在我关于获取壁纸的解释中发现了一个缺陷(请参阅下面的评论)。是的,我同意我们不应该依赖注册表值,如果有一个 API 函数来做同样的目的。

于 2010-10-18T11:31:18.737 回答