QQ登录

只需一步,快速开始

获取桌面上所有程序图标的标题--上位机VC

[ 复制链接 ]

获取桌面上所有程序图标的标题--上位机VC

获取桌面上所有程序图标的标题--上位机VC
获取桌面上所有程序图标的标题
功能展示
桌面上有各种各样的图标,图标下配有对应文字说明,如我的电脑图标,回收站图标网上邻居图标,我们当前例程实现桌面图标对应的文字获取,效果如图,点击按钮<获取桌面图标标题>例程会将桌面上所有图标对应标题全部罗列到列表中
要点提示
例程首先是桌面窗口句柄的获取,通过代码hWnd = FindWindowEx(NULL, NULL, “Progman”, NULL),hWnd = FindWindowEx(hWnd, NULL, “SHELLDLL_DefView”, NULL)hWnd = FindWindowEx(hWnd, NULL, “SysListView32”, NULL)可获得桌面窗口句柄;

通过函数SendMessage()向窗口句柄发送消息LVM_GETITEMCOUNT,可获得桌面图标个数
Int   nItemCount =::SendMessage(hWnd, LVM_GETITEMCOUNT, (WPARAM)0, (LPARAM)0);
然后再通过函数::SendMessage(hWnd,LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)pData);
获得图标相关数据,
通过ReadProcessMemory(hProcess,pString, szText, ALLOC_SIZE, &BytesRead);
就可获得图标对应的标题,保存在szText变量里;
最后就是通过CListCtrl控件的成员函数SetItemText()显示获得的标题

实现功能
1.新建基于对话框的应用程序

2.拖拽一列表控件ID保持不变IDC_LIST1,添加一按钮《获取桌面图标标题》关联按钮的点击函数,获取标题
  1. void CGkbc8Dlg::OnButton1()
  2. {
  3.         CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST1);
  4. pList->DeleteAllItems();
  5. #define ALLOC_SIZE 200// bytes to allocate for icon text and LVITEM struct

  6. HWND                hWnd;                                // handle to desktop window
  7. DWORD                dwPID;                                // explorer process ID (associated with desktop)
  8. HANDLE                hProcess;                        // handle to explorer process (associated with desktop)
  9. LPVOID                pData;                                // pointer to LVITEM struct in explorer address space
  10. LPVOID                pString;                        // pointer to icon text in explorer address space
  11. char                szText[ALLOC_SIZE];        // char array of icon text in application address space
  12. SIZE_T                BytesRead;                        // for ReadProcessMemory
  13. SIZE_T                BytesWritten;                // for WriteProcessMemory
  14. BOOL                fResult;                        // for ReadProcessMemory/WriteProcessMemory
  15. LVITEM                lvi;                                // LVITEM struct
  16. int                        i;                                        // counter for enumeration
  17. int                        nItemCount;                        // icon item count

  18.         // get desktop window handle "Progman=EXPLORER.EXE桌面图标下方窗口"
  19.         if(((hWnd = FindWindowEx(NULL, NULL, "Progman", NULL)) == NULL) ||
  20.            ((hWnd = FindWindowEx(hWnd, NULL, "SHELLDLL_DefView", NULL)) == NULL) ||
  21.            ((hWnd = FindWindowEx(hWnd, NULL, "SysListView32", NULL)) == NULL))
  22.         {
  23.                 MessageBox("Could not get desktop window.");
  24.                 goto Exit;
  25.         }

  26.         // get desktop window process ID (explorer.exe)
  27.         GetWindowThreadProcessId(hWnd, &dwPID);
  28.         // open process to get explorer process handle
  29.         hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
  30.         // allocate memory in explorer's address space
  31.         // allocate space for LVITEM struct
  32.         
复制代码
  1. pData = VirtualAllocEx(hProcess, NULL, ALLOC_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  2.         // allocate space for string (i.e. "Network Neighborhood")
  3.         pString = VirtualAllocEx(hProcess, NULL, ALLOC_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

  4.         // init LV_ITEM struct
  5.         ZeroMemory(&lvi, sizeof(LVITEM));
  6.         lvi.iItem = 0;
  7.         lvi.iSubItem = 0;
  8.         lvi.cchTextMax = 500;
  9.         lvi.pszText = (char*)pString;        // use alloc'd string space
  10.         // write the contents of lvi into explorer's address space
  11.         fResult = WriteProcessMemory(hProcess, pData, &lvi, sizeof(LVITEM), &BytesWritten);

  12.         // get item count on desktop
  13.         nItemCount = ::SendMessage(hWnd, LVM_GETITEMCOUNT, (WPARAM)0, (LPARAM)0);        
  14.         for(i = 0; i < nItemCount; i++)// enum all icons
  15.         {
  16.                 // get item's name
  17.                 ::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)pData);

  18.                   // read back lvi struct (for debugging purposes only)
  19.                 fResult = ReadProcessMemory(hProcess, pData, szText, ALLOC_SIZE, &BytesRead);
  20.                 // read text of queried item
  21.                 fResult = ReadProcessMemory(hProcess, pString, szText, ALLOC_SIZE, &BytesRead);

  22.                 CString sIndex;
  23.                 sIndex.Format("%d",i);
  24.                 pList->InsertItem(i,"");
  25.                 pList->SetItemText(i,0,sIndex);
  26.                 pList->SetItemText(i,1,szText);
  27.         }        
  28.         // free alloc'd memory for string and LVITEM structs
  29.         if(!VirtualFreeEx(hProcess, pString, ALLOC_SIZE, MEM_DECOMMIT))
  30.         {
  31.                 MessageBox("VirtualFreeEx failed.");
  32.                 goto Exit;
  33.         }
  34.         
复制代码
  1. if(!VirtualFreeEx(hProcess, pData, ALLOC_SIZE, MEM_DECOMMIT))
  2.         {
  3.                 MessageBox("VirtualFreeEx failed.");
  4.                 goto Exit;
  5.         }
  6.         CloseHandle(hProcess);        // close process handle

  7. Exit:
  8.         return;        
  9. }
复制代码
3.在程序初始化时记得初始化列表控件,给列表添加表头
  CListCtrl* pList= (CListCtrl*)GetDlgItem(IDC_LIST1);
  pList->ModifyStyle(0,LVS_REPORT,0);
  pList->InsertColumn(0,"索引",LVCFMT_LEFT,50);
  pList->InsertColumn(1,"标题",LVCFMT_LEFT,500);



我们来演示下功能实现的整个过程

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:获取桌面上所有程序图标的标题--上位机VC.txt 
文件大小:48 Bytes  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

回复

使用道具 举报

快速回复 返回列表 客服中心 搜索