桌面图标任意摆

来源:互联网 发布:聊城职业技术学院网络 编辑:程序博客网 时间:2024/04/29 06:56

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


原创粉丝点击