桌面图标任意摆

核心实现思想,通过windows 消息机制,记录和修改桌面图标的位置。

Win7验证通过。 欢迎转载使用。

#ifndef __SETICONONDESTOP__
#define __SETICONONDESTOP__


class CSetIconOnDestop
{

public: 
	CSetIconOnDestop();
	~CSetIconOnDestop();

	typedef struct _DestopIconInfo
	{
		DWORD nItem;
		string sIconName;
		POINT pt;
	}DESTOPICONINFO , *PDESTOPICONINFO;

	bool GetIcon();
	bool SetIcon();
	bool SaveInfo();
	bool ReadInfo();
private:

	vector<DESTOPICONINFO> m_arrMap;
	HWND m_hWndDestop;
	HANDLE m_hDestopHandle;
	DWORD m_nIconCont;
	bool GetAllIcon(); //获取当前桌面上所有图标的坐标信息
	DWORD GetIconCount(); //获取当前桌面上的图标数
	bool GetDestopHwnd();	//获取当前桌面的句柄
	bool SetAllIcon();	//设置当前所有图标到记录的位置
	bool WriteToFile();	//写信息至文件
	bool ReadFromFile();//从文件读取信息



};

#endif

#include "StdAfx.h"
#include "SetIconOnDestop.h"

CSetIconOnDestop::CSetIconOnDestop(void)
{
	m_nIconCont = 0;
	m_hWndDestop = (HWND)-1;
	m_hDestopHandle = (HANDLE)-1;
 	if (!GetDestopHwnd())
	{
		AfxMessageBox("初始化桌面失败!");
	}
}

CSetIconOnDestop::~CSetIconOnDestop(void)
{
	m_arrMap.clear();
	m_hWndDestop = (HWND)-1;
	m_hDestopHandle = (HANDLE)-1;
	m_nIconCont = -1;
}
bool CSetIconOnDestop::GetAllIcon()
{
	if (m_arrMap.size() > 0)
	{
		m_arrMap.clear();
	}
	GetIconCount();

	for (int i = 0; i<m_nIconCont;i++)
	{
		PVOID pv  = VirtualAllocEx(m_hDestopHandle,NULL,sizeof(POINT),MEM_COMMIT,PAGE_READWRITE);
		ListView_GetItemPosition(m_hWndDestop,i,pv);
		POINT pt;
		ReadProcessMemory(m_hDestopHandle,pv,&pt,sizeof(POINT),NULL);
		VirtualFreeEx(m_hDestopHandle,pv,0,MEM_RELEASE);

		char *pIconName = (char*)VirtualAllocEx(m_hDestopHandle,NULL,512,MEM_COMMIT,PAGE_READWRITE);
		LV_ITEM *plvitem = (LV_ITEM*)VirtualAllocEx(m_hDestopHandle,NULL,sizeof(LV_ITEM),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
		LV_ITEM lvitem;
		lvitem.cchTextMax = 512;
		lvitem.iSubItem = 0;
		lvitem.pszText = pIconName;
		
		WriteProcessMemory(m_hDestopHandle,plvitem,&lvitem,sizeof(LV_ITEM),NULL);
		::SendMessage(m_hWndDestop,LVM_GETITEMTEXT,i,(LPARAM)plvitem);
		char szIconName[512] = {0};
		::ReadProcessMemory(m_hDestopHandle,pIconName,szIconName,512,NULL);

		VirtualFreeEx(m_hDestopHandle,pIconName,0,MEM_RELEASE);
		VirtualFreeEx(m_hDestopHandle,plvitem,0,MEM_RELEASE);
		
		DESTOPICONINFO iconInfo;
		iconInfo.nItem = i;
		iconInfo.pt = pt;
		iconInfo.sIconName = szIconName;

		m_arrMap.push_back(iconInfo);
	}
	
	if (m_arrMap.size()<0)
	{
		AfxMessageBox("获取桌面图标失败!");
		return false;
	}

	return true;
}

DWORD CSetIconOnDestop::GetIconCount()
{
	
	m_nIconCont = ListView_GetItemCount(m_hWndDestop);

	return m_nIconCont;
}
bool CSetIconOnDestop::GetDestopHwnd()
{
	HWND hDeskTop;
	hDeskTop = ::FindWindow("Progman",NULL);
	hDeskTop = ::FindWindowEx(hDeskTop,0,"SHELLDLL_DefView",NULL);
	hDeskTop = ::FindWindowEx(hDeskTop,0,"SysListView32",NULL);
	if (hDeskTop != NULL)
	{
		m_hWndDestop = hDeskTop;
		DWORD dwProcessID;
		GetWindowThreadProcessId(hDeskTop,&dwProcessID);
		m_hDestopHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);
		return true;
	}
	return false;
}

bool CSetIconOnDestop::GetIcon()
{
	return GetAllIcon();
}
bool CSetIconOnDestop::SetIcon()
{
	return SetAllIcon();
}
bool CSetIconOnDestop::SetAllIcon()
{
	if (m_nIconCont <= 0)
	{
		AfxMessageBox("当前图标数为0!");
		return false;
	}

	vector<DESTOPICONINFO>::iterator it;
	int i =0;
	for (it = m_arrMap.begin();it!=m_arrMap.end();it++)
	{
		DESTOPICONINFO info = *it;
			
		ListView_SetItemPosition(m_hWndDestop,i,info.pt.x,info.pt.y);
		i++;
	}


}

bool CSetIconOnDestop::WriteToFile()
{
	if (m_arrMap.size() <= 0)
	{
		AfxMessageBox("坐标信息为空");
		return false;
	}


	HANDLE hFile = CreateFile("IconInfo.Hz",
		GENERIC_READ|GENERIC_WRITE,
		FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
		NULL,
		OPEN_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,
		0);
	if (hFile== INVALID_HANDLE_VALUE)
	{
		CloseHandle(hFile);
		return false;
	}
	vector<DESTOPICONINFO>::iterator it;
	for (it = m_arrMap.begin();it != m_arrMap.end();it++)
	{
		DESTOPICONINFO info;
		info = *it;
		DWORD wleng;
		DWORD nLength = info.sIconName.length();
		WriteFile(hFile,&(nLength),4,&wleng,0);
		WriteFile(hFile,info.sIconName.c_str(),info.sIconName.length(),&wleng,0);
		WriteFile(hFile,&(info.nItem),4,&wleng,0);
		WriteFile(hFile,&(info.pt.x),4,&wleng,0);
		WriteFile(hFile,&(info.pt.y),4,&wleng,0);
	}

	CloseHandle(hFile);
	return true;
}
bool CSetIconOnDestop::SaveInfo()
{
	return WriteToFile();
}
bool CSetIconOnDestop::ReadFromFile()
{

	if (m_arrMap.size() > 0)
	{
		m_arrMap.clear();
	}
	HANDLE hFile = CreateFile("IconInfo.Hz",
		GENERIC_READ|GENERIC_WRITE,
		FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE,
		NULL,
		OPEN_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,
		0);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("打开文件失败!");
		return false;
	}
	DWORD nHightLength;
	DWORD nLength = GetFileSize(hFile,&nHightLength);
	BYTE* pBuff = new BYTE[nLength];
	memset(pBuff,0,nLength);
	ReadFile(hFile,pBuff,nLength,&nHightLength,0);

	CloseHandle(hFile);
	DWORD nCurrent = 0;
	
	DWORD nStart = 0;

	while(nStart < nLength)
	{
		DESTOPICONINFO info;
		DWORD length =  *(DWORD *)pBuff;
		char szBuff[1024] = {0};
		nStart += 4;
		memcpy(szBuff,(char*)pBuff + nStart,length);
		nStart += length;
		info.sIconName = szBuff;
		info.nItem = *(DWORD *)((char *)pBuff + nStart);
		nStart += 4;
		info.pt.x = *(DWORD *)((char *)pBuff + nStart);
		nStart += 4;
		info.pt.y = *(DWORD *)((char *)pBuff + nStart);
		nStart += 4;

		m_arrMap.push_back(info);
		
	}
	if (m_arrMap.size()<= 0)
	{
		AfxMessageBox("初始化文件失败!");
		return false;
	}

	return true;
}
bool CSetIconOnDestop::ReadInfo()
{
	return ReadFromFile();
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值