核心实现思想,通过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();
}