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 is NULL」です。それは間違ったコードですか?

私の質問は、SysListView32 でデスクトップの壁紙として表示されるビットマップ データを取得する方法です。そして、それは可能ですか?

よろしく。

4

1 に答える 1

1

デスクトップに直接描画するには、デスクトップ ビットマップ データを取得する必要はありませんが、デスクトップ デバイス コンテキスト (DC) を取得します。

FindWindow('SysListView32', nil);(クラス名は将来変更される可能性があります) を使用する代わりに、 GetDesktopWindow()を使用してデスクトップ ウィンドウへのハンドルを取得してから、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\DesktopWallpaper値は、画面の背景のビットマップが格納されているファイルの名前を指定します。Windows Vista 以降では、壁紙はBMPorJPGファイルのどちらでもかまいません。そのため、LoadImage()API 関数を使用して壁紙を読み込むのではなく、VC++ を使用することを想定して、代わりにCImageorを使用する必要があります。GDI+

ノート

@Remy Lebeau は、壁紙の取得に関する私の説明に欠陥を見つけました (以下の彼のコメントを参照)。はい、同じ目的を実行するための API 関数がある場合、レジストリ値に依存するべきではないことに同意します。

于 2010-10-18T11:31:18.737 に答える