デスクトップのアイコンを取得しようしようとして、以下のようなコードを書きました。
//デスクトップのリストビューコントロールに登録されているイメージリストを取得
//hDeskはデスクトップのリストビューコントロールのウィンドウハンドル(FindWindowで得られたハンドル)
HIMAGELIST hImageList = ListView_GetImageList(hDesk, LVSIL_NORMAL);
//イメージリストからアイコンを取得
HICON hIcon = ImageList_GetIcon(hImageList, 0, ILD_TRANSPARENT);
そこでいろいろと調べてみると、他プロセスのイメージハンドルを取得するには、どうやらVirtualAllocEx関数を利用して、他プロセスにメモリを確保し、そこにイメージハンドルを書き込んでから自プロセスに移す、という作業をしなければならないようで、
//リストビューコントロールのプロセスにメモリを用意する
//hProcessはリストビューコントロールのプロセスのハンドル
HIMAGELIST *vimg = (HIMAGELIST *)VirtualAllocEx(hProcess, NULL, sizeof(HIMAGELIST), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
//イメージリストを取得
HIMAGELIST hIconImageList;
HIMAGELIST rimglst = ListView_GetImageList(hDeskWnd, LVSIL_NORMAL);
WriteProcessMemory(hProcess, vimg, &rimglst, sizeof(HIMAGELIST), NULL);
ReadProcessMemory(hProcess, vimg, &hIconImageList, sizeof(HIMAGELIST), NULL);
//イメージリストからアイコンを取得
HICON hIcon = ImageList_GetIcon(hIconImageList, 0, ILD_TRANSPARENT);
//使ったらきちんと返しましょう
VirtualFreeEx(hProcess, vimg, 0, MEM_RELEASE);
WriteProcessMemory, ReadProcessMemory関数の戻り値は共にTRUEでした。
どのようにすれば、デスクトップアイコンを取得することが出来るのでしょうか。
ご教示のほどよろしくお願いいたします。
環境:WindowXP HomeEdition SP3
VisualStudio2008、Win32APIを使用しています。