c++ 移动桌面图标

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;
	
}

以上代码,亲测有效,欢迎转载,转载请注明出处。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值