1. 程式人生 > 實用技巧 >c++ 獲取桌面圖示的座標與名稱

c++ 獲取桌面圖示的座標與名稱

win7 win10 x64 有效

#include<Windows.h>
#include<commctrl.h>
#include <stdio.h>

 

 

typedef struct tagLVITEM64A
{
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
INT64 pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
int iIndent;
#endif
#if (_WIN32_WINNT >= 0x501)
int iGroupId;
UINT cColumns; // tile view columns
PUINT puColumns;
#endif
} LVITEM64A, *LPLVITEM64A;


void GetChromePT(HWND h)
{

DWORD dwProcessId;
HWND hDeskTop;
hDeskTop = ::FindWindow(L"progman", NULL);
hDeskTop = ::FindWindowEx(hDeskTop, 0, L"shelldll_defview", NULL);
hDeskTop = ::FindWindowEx(hDeskTop, 0, L"syslistview32", NULL); //獲取桌面視窗bai控制代碼du;
GetWindowThreadProcessId(hDeskTop, &dwProcessId);//通過桌面視窗控制代碼獲取此視窗所在程序的PID,其實就是explorer程序
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);//開啟zhi指定PID程序,取得程序控制代碼

tagLVITEM64A *_lv,lvi;
LPVOID lpvPt = VirtualAllocEx(hProcess, NULL, sizeof(POINT), MEM_COMMIT, PAGE_READWRITE);//在指定程序裡面申請一個POINI結構大小的空間.

_lv = (tagLVITEM64A*)VirtualAllocEx(hProcess, NULL, sizeof(tagLVITEM64A), MEM_COMMIT, PAGE_READWRITE);//在指定程序裡面申請一個文字結構大小的空間.


char item[512] = { 0 };
char *_item;
POINT pt;

//獲取視窗listbox 控制代碼  與 獲取桌面圖示資訊無關 可忽略
HWND h_list = GetListHandle(h);
int m_iconCount = ListView_GetItemCount(hDeskTop);
_item = (char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);


ZeroMemory(&lvi, sizeof(LVITEM));
//lv.mask = LVIF_TEXT;
lvi.cchTextMax = 512;


for (size_t i = 1; i < m_iconCount; i++)
{
//座標
ListView_GetItemPosition(hDeskTop, i, lpvPt);//獲取第一個圖示的座標,存入lpvPt
ReadProcessMemory(hProcess, lpvPt, &pt, sizeof(POINT), NULL);
//名稱
lvi.iSubItem = 0;
lvi.pszText = (INT64)_item;
WriteProcessMemory(hProcess, _lv,&lvi,sizeof(LVITEM),NULL);
SendMessage(hDeskTop, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lv);
ReadProcessMemory(hProcess, _item, item, 512,NULL );
wchar_t pt_char[MAXBYTE] = { 0 };
//填充listbox
wsprintf(pt_char, L"%ld---%ld--name:%s", pt.x,pt.y, item); //一句話解決
SendMessage(h_list, LB_ADDSTRING, 0, (LPARAM)pt_char);
}
//lpvPt不是本程序裡面的,不能使用,所以就要
//利用ReadProcessMemory從指定程序給讀出來
VirtualFreeEx(hProcess, lpvPt, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, _lv, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, _item, 0, MEM_RELEASE);
//釋放申請的空間
CloseHandle(hProcess);//關閉控制代碼

}