Как получить растровые данные из SysListView32? - PullRequest
0 голосов
/ 18 октября 2010

Я хочу получить растровые данные обоев рабочего стола 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 is NULL"Это неправильный код?

Мой вопрос заключается в том, как получить растровые данные, отображаемые в качестве обоев рабочего стола на SysListView32?И возможно ли это?

привет.

1 Ответ

1 голос
/ 18 октября 2010

Чтобы рисовать прямо на рабочем столе, вам не нужно получать данные растрового изображения на рабочем столе, но контекст рабочего стола устройства (DC).

Вместо использования FindWindow('SysListView32', nil); (имя класса может быть изменено в будущем), вы должны использовать GetDesktopWindow () , чтобы получить дескриптор окна рабочего стола, а затем использовать GetDC () для извлечения контекста устройства (DC) окна рабочего стола.

Вы можете рисовать текст, используя TextOut () , DrawText () или DrawTextEx () .

Наконец, вызовите ReleaseDC () , чтобы освободить настольный контроллер домена, освободив его для использования другими приложениями.

Например:

  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, поэтому не используйте функцию API LoadImage() для загрузки обоев, вместо этого следует использовать CImage или GDI+, предполагая, что вы используете VC ++.

Примечание

@ Реми Лебо поймал ошибку в моем объяснении получения обоев (см. Его комментарий ниже). Да, я согласен с тем, что нам не следует полагаться на значение реестра, если для этой цели существует функция API.

...