c++ 移动桌面图标
之前分享过一篇关于移动桌面图标的文章。那种通过SendMessage函数来改变图标位置的方式,有一些缺陷(比如不能通知iconcache.db 及时刷新等)。后面有继续寻找其他改变桌面图标位置的API。并且能及时通知iconcache.db及时刷新桌面图标信息。
好了,话不多说,直接上代码:
// 处理COM组件类,方便COM组件的初始化以及释放资源
class CCoInitialize {
public:
CCoInitialize() : m_hr(CoInitialize(NULL)) { }
~CCoInitialize() { if (SUCCEEDED(m_hr)) CoUninitialize(); }
operator HRESULT() const { return m_hr; }
HRESULT m_hr;
};
// 查找桌面文件视图
void FindDesktopFolderView(REFIID riid, void **ppv)
{
CComPtr<IShellWindows> spShellWindows;
spShellWindows.CoCreateInstance(CLSID_ShellWindows);
CComVariant vtLoc(CSIDL_DESKTOP);
CComVariant vtEmpty;
long lhwnd;
CComPtr<IDispatch> spdisp;
spShellWindows->FindWindowSW(
&vtLoc, &vtEmpty,
SWC_DESKTOP, &lhwnd, SWFO_NEEDDISPATCH, &spdisp);
CComPtr<IShellBrowser> spBrowser;
CComQIPtr<IServiceProvider>(spdisp)->
QueryService(SID_STopLevelBrowser,
IID_PPV_ARGS(&spBrowser));
CComPtr<IShellView> spView;
spBrowser->QueryActiveShellView(&spView);
spView->QueryInterface(riid, ppv);
}
// 移动指定图标位置
// iconname : icon图标名称
// x: 图标x轴值
// y: 图标y轴值
int modifyIconPos(char* iconnameparame, int x, int y)
{
int errorNum = 10;
std::wstring temName = U8ToUnicode(iconnameparame);
CComPtr<IFolderView> spView;
FindDesktopFolderView(IID_PPV_ARGS(&spView));
if (NULL == spView)
{
return errorNum;
}
CComPtr<IEnumIDList> spEnum;
spView->Items(SVGIO_ALLVIEW, IID_PPV_ARGS(&spEnum));
CComPtr<IShellFolder> spFolder;
spView->GetFolder(IID_PPV_ARGS(&spFolder));
for (CComHeapPtr<ITEMID_CHILD> spidl; spEnum->Next(1, &spidl, nullptr) == S_OK; spidl.Free())
{
STRRET str;
spFolder->GetDisplayNameOf(spidl, SHGDN_NORMAL, &str);
CComHeapPtr<wchar_t> spszName;
StrRetToStr(&str, spidl, &spszName);
if (std::wstring(spszName) == temName)
{
PCITEMID_CHILD apidl[1] = { spidl };
POINT pt;
pt.x = x;
pt.y = y;
// 这里就是设置桌面图标的关键代码
spView->SelectAndPositionItems(1, apidl, &pt, SVSI_POSITIONITEM);
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_IDLIST, spidl, NULL);
errorNum = 20;
return errorNum;
}
errorNum++;
}
return errorNum;
}
// 移动指定图标位置
// iconname : icon图标名称
// x: 图标x轴值
// y: 图标y轴值
int MoveIconPosEx(char* iconnameparame, int x, int y)
{
int errorNum = 0;
CCoInitialize initCom;
errorNum = modifyIconPos(iconnameparame, x, y);
return errorNum;
}
以上代码,亲测有效,欢迎转载,转载请注明出处。