移动桌面图标 F5刷新 图标重新排列问题解决方案

最近在做桌面图标管理小工具,遇到一个问题:把图标按照预先设定好的位置移动好后,F5刷新桌面(或右键->刷新)图标又还原了。。。
最开始,我想了一个办法:移动桌面图标以后,就给桌面窗口发一个禁止重绘的消息,这样图标就不会还原啦。但是在实际环境中发现,会带来另外一个问题:凡是在桌面上面呈现出来的画面,都不会被清除。这明显不符合需求了,遂放弃这种方式。
后面搜索到一篇文章,讲到重新设置一下桌面工作区域,就能避免图标重新排序的bug。我试验了一下,果然能行!这里贴出我的代码,希望能帮助到刚好需要的朋友。

// 刷新桌面(重绘桌面)
int FreshDesktop(int bShow)
{
	::Sleep(FreshSpace);

	// 获取屏幕分辨率
	int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
	int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);

	HWND hwndParent = ::FindWindow(Progman, ProgramManager);
	if (nullptr == hwndParent)
	{
		return 2;
	}

	HWND hwndSHELLDLL_DefView = ::FindWindowEx(hwndParent, NULL, ShellView, NULL);
	if (nullptr == hwndSHELLDLL_DefView)
	{
		return 3;
	}

	HWND hDestTop = ::FindWindowEx(hwndSHELLDLL_DefView, NULL, SysListView32, FolderView);
	if (nullptr == hDestTop)
	{
		return 4;
	}

	unsigned long pid;
	HANDLE process;

	GetWindowThreadProcessId(hDestTop, &pid);
	process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, pid);

	//防止F5刷新恢复之前的图标,手动设置一下工作区,第一个参数必须>=2。
	PVOID pRcWorkAreas = (RECT*)VirtualAllocEx(process, NULL, sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);
	RECT rcTmp = { 0, 0, nScreenWidth, nScreenHeight };
	WriteProcessMemory(process, pRcWorkAreas, &rcTmp, sizeof(RECT), NULL);
	::SendMessage(hDestTop, LVM_SETWORKAREAS, 4, (LPARAM)pRcWorkAreas);
	VirtualFreeEx(process, pRcWorkAreas, 0, MEM_RELEASE);

	CloseHandle(process);
	
	//::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST | SHCNF_FLUSH, NULL, NULL);
	return 1;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值