如題,怎么樣獲取控制面板里的圖示
uj5u.com熱心網友回復:
http://www.cnblogs.com/likebeta/archive/2011/10/27/2226457.html你參考一下這個帖子。
獲取控制面板的圖示,你是要獲取圖示資源嗎?
uj5u.com熱心網友回復:
應該是呼叫 SHGetFileInfo API吧?去msdn上調查看看
uj5u.com熱心網友回復:
這是很難辦到的! 我看了 wtl 的explorer 程式(用com技術的),能夠navigate到控制板目錄,但最侄訓是不能遍歷所有item。網上這個的參考資料還是很少的。uj5u.com熱心網友回復:
%SystemRoot%\system32\SHELL32.dll圖片都在這個里面。。
uj5u.com熱心網友回復:
我也一直測驗發現列舉不到專案,只列舉到一個 Flash Player。剛剛想到是不是 64 位的問題,于是將專案改成 64 位的,居然真的可以了。目前正在研究如何在 32 位程式中列舉出 64 位的控制面板專案串列。代碼,需編譯為 64 位專案:
#include <stdio.h>目前正在尋找 32 位程式列舉控制面板專案資訊的方法。
#include <stdlib.h>
#include <tchar.h>
#include <windows.h>
#include <objbase.h>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
#include <shlobj.h>
#pragma comment(lib, "uuid.lib")
int main(int argc, char *argv[])
{
CoInitialize(NULL);
IShellFolder *pshf = NULL;
HRESULT hr = SHGetDesktopFolder(&pshf);
if (hr == S_OK) {
ITEMIDLIST *pidl = NULL;
hr = SHGetFolderLocation(NULL, CSIDL_CONTROLS, NULL, 0, &pidl);
if (hr == S_OK) {
IShellFolder *pcpfldr = NULL;
hr = pshf->BindToObject(pidl, NULL, &IID_IShellFolder, (void **)&pcpfldr);
if (hr == S_OK) {
IEnumIDList *penum = NULL;
hr = pcpfldr->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &penum);
if (hr == S_OK) {
ULONG ulFetched = 0;
ITEMIDLIST *pcpitem = NULL;
while (penum->Next(1, &pcpitem, &ulFetched) == S_OK) {
/*
STRRET strRet = { 0 };
TCHAR szBuff[MAX_PATH] = { 0 };
pcpfldr->GetDisplayNameOf(pcpitem, SHGDN_NORMAL, &strRet);
StrRetToBuf(&strRet, pcpitem, szBuff, MAX_PATH);
SHFILEINFO shfi = { 0 };
SHGetFileInfo((LPCTSTR)pcpitem, 0, &shfi, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_ICON);
_tprintf(_T("顯示名稱:%s\n")
_T("圖示句柄:%s\n")
_T("\n"),
szBuff,
shfi.hIcon);
*/
SHFILEINFO shfi = { 0 };
SHGetFileInfo((LPCTSTR)pcpitem, 0, &shfi, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_ICON | SHGFI_DISPLAYNAME);
_tprintf(_T("顯示名稱:%s\n")
_T("圖示句柄:%s\n")
_T("\n"),
shfi.szDisplayName,
shfi.hIcon);
CoTaskMemFree(pcpitem);
}
penum->Release();
}
pcpfldr->Release();
}
CoTaskMemFree(pidl);
}
pshf->Release();
}
CoUninitialize();
return 0;
}
uj5u.com熱心網友回復:
注意,由于我用的是 C 代碼,轉換 C++ 時,從:hr = pshf->lpVtbl->BindToObject(pshf, pidl, NULL, &IID_IShellFolder, (void **)&pctl);到:
hr = pshf->BindToObject(pidl, NULL, &IID_IShellFolder, (void **)&pcpfldr);出現失誤,正確應為:
hr = pshf->BindToObject(pidl, NULL, IID_IShellFolder, (void **)&pcpfldr);
uj5u.com熱心網友回復:
@SXJIAKE,我試試看uj5u.com熱心網友回復:
我試了一下,獲控制面板項的名字的話,我上面的代碼是不會成功的,用注釋掉的那部分"GetDisplayNameOf"代替。uj5u.com熱心網友回復:
不行,只能列舉到兩個,獲取的名字都是空
uj5u.com熱心網友回復:
代碼在這里:#include <stdio.h>另外,你需要注意我說的重點:64 位系統上,需要將專案改成 64 位的。當然,如果你已經是 64 位,也有可能會有問題。據我測驗,目前 Unicode 版本無法列舉成功,具體的錯誤之處并未詳查。以下是我在 VC 命令列下的所有列印內容:
#include <stdlib.h>
#include <tchar.h>
#define WINVER 0x0500
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <objbase.h>
#include <shlwapi.h>
#include <shlobj.h>
#include <shellapi.h>
#pragma comment(lib, "uuid.lib")
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "shlwapi.lib")
int _tmain( int argc, TCHAR *argv[] )
{
HRESULT hr = CoInitialize(NULL);
if (hr == S_OK) {
IShellFolder *pshfRoot = NULL;
hr = SHGetDesktopFolder(&pshfRoot);
if (hr == S_OK) {
ITEMIDLIST *pidlFolder = NULL;
hr = SHGetFolderLocation(NULL, CSIDL_CONTROLS, NULL, 0, &pidlFolder);
if (hr == S_OK) {
IShellFolder *pshfFolder = NULL;
hr = pshfRoot->BindToObject(pidlFolder, NULL, IID_IShellFolder, (void **)&pshfFolder);
if (hr == S_OK) {
IEnumIDList *pemIdList = NULL;
hr = pshfFolder->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &pemIdList);
if (hr == S_OK) {
while (1) {
ULONG ulFetched = 0;
ITEMIDLIST *pidlItem = NULL;
hr = pemIdList->Next(1, &pidlItem, &ulFetched);
if (hr != S_OK) {
break;
}
STRRET strRet = { 0 };
SHFILEINFO shfi = { 0 };
SHGetFileInfo((LPCTSTR)pidlItem, 0, &shfi, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_ICON);
TCHAR szBuff[MAX_PATH] = { 0 };
pshfFolder->GetDisplayNameOf(pidlItem, SHGDN_NORMAL, &strRet);
StrRetToBuf(&strRet, pidlItem, szBuff, MAX_PATH);
_tprintf(_T("Name: %s\nIcon: 0x%p\n"), szBuff, shfi.hIcon);
CoTaskMemFree(pidlItem);
}
pemIdList->Release();
}
pshfFolder->Release();
}
CoTaskMemFree(pidlFolder);
}
pshfRoot->Release();
}
CoUninitialize();
}
return 0;
}
Setting environment for using Microsoft Visual Studio 2005 x64 tools.
D:\MSVS8\VC>cd C:\Users\N-053\Desktop\enumcp
D:\MSVS8\VC>C:
C:\Users\N-053\Desktop\enumcp>cl enumcp.cpp
用于 x64 的 Microsoft (R) C/C++ 優化編譯器 14.00.50727.762 版
著作權所有(C) Microsoft Corporation。保留所有權利。
enumcp.cpp
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.
/out:enumcp.exe
enumcp.obj
C:\Users\N-053\Desktop\enumcp>enumcp.exe
Name: 電源選項
Icon: 0x0000000002DD093D
Name: NVIDIA 控制面板
Icon: 0x0000000001AE091D
Name: 任務欄和導航
Icon: 0x00000000047B08B3
Name: 憑據管理器
Icon: 0x00000000051F070F
Name: 默認程式
Icon: 0x0000000001F80587
Name: RemoteApp 和桌面連接
Icon: 0x0000000008E0084D
Name: Windows 防火墻
Icon: 0x0000000006B0059F
Name: 電話和調制解調器
Icon: 0x00000000013A08F7
Name: 語音識別
Icon: 0x0000000008300711
Name: Windows 移動中心
Icon: 0x000000000281050B
Name: 用戶帳戶
Icon: 0x00000000031C08B5
Name: 區域
Icon: 0x000000000E5008D9
Name: 家庭組
Icon: 0x00000000016F0923
Name: 滑鼠
Icon: 0x0000000004A80837
Name: 檔案資源管理器選項
Icon: 0x0000000003150849
Name: 鍵盤
Icon: 0x00000000039E0835
Name: 設備管理器
Icon: 0x0000000003760927
Name: 程式和功能
Icon: 0x00000000015904DB
Name: 索引選項
Icon: 0x0000000008D30763
Name: 網路和共享中心
Icon: 0x0000000004F008BB
Name: 自動播放
Icon: 0x00000000051D082F
Name: 同步中心
Icon: 0x0000000000720801
Name: 恢復
Icon: 0x000000000EF4080B
Name: Internet 選項
Icon: 0x0000000004230845
Name: 設備和列印機
Icon: 0x0000000006D7076B
Name: 顏色管理
Icon: 0x00000000039B08D7
Name: 備份和還原(Windows 7)
Icon: 0x00000000011F090D
Name: 系統
Icon: 0x0000000003EE085F
Name: 安全性與維護
Icon: 0x0000000000FE0773
Name: 字體
Icon: 0x0000000000870751
Name: 語言
Icon: 0x00000000014B0725
Name: 顯示
Icon: 0x0000000000E9070D
Name: 疑難解答
Icon: 0x0000000004590705
Name: 管理工具
Icon: 0x0000000001C506EF
Name: 輕松使用設定中心
Icon: 0x00000000057E06E9
Name: Windows Defender
Icon: 0x00000000014706C5
Name: BitLocker 驅動器加密
Icon: 0x00000000132806C1
Name: 日期和時間
Icon: 0x000000000C9E05DF
Name: 作業檔案夾
Icon: 0x0000000007690597
Name: 個性化
Icon: 0x0000000002250557
Name: 聲音
Icon: 0x0000000001300553
Name: 檔案歷史記錄
Icon: 0x00000000010A0509
Name: 存盤空間
Icon: 0x000000000C750489
Name: Realtek高清晰音頻管理器
Icon: 0x000000000252086D
Name: Flash Player (32 位)
Icon: 0x0000000012B50487
Name: 英特爾? 核芯顯卡
Icon: 0x0000000000250911
uj5u.com熱心網友回復:
您好我是本版版主
此帖已多日無人關注
請您及時結帖
如您認為問題沒有解決可按無滿意結帖處理
另外本版設定了疑難問題匯總帖
并已在版面置頂
相關規定其帖子中有說明
您可以根據規定提交您帖子的鏈接
如您目前不想結帖只需回帖說明
我們會洗掉此結帖通知
見此回復多日內無回應
我們將強制結帖
相關規定詳見界面界面版關于版主結帖作業的具體辦法
uj5u.com熱心網友回復:
向10樓學習。uj5u.com熱心網友回復:
32位,搞定了嗎 朋友?uj5u.com熱心網友回復:
http://download.csdn.net/detail/schlafenhamster/3011852"改進版PeIcons.zip"
打開SHELL32.dll
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/108139.html
標籤:界面
上一篇:沒有搞過這種問題,求指教
