delphi 获取桌面图标坐标及名称
uses Winapi.CommCtrl; //x64 x86 = LVITEM type tagLVITEM64A = record mask: UINT; iItem: Integer; iSubItem: Integer; state: UINT; stateMask: UINT; pszText: INT64; cchTextMax: Integer; iImage: integer; lParam: LPARAM; {$IFDEF _WIN32_IE >= $0300} iIndent: Integer; {$ENDIF} {$IFDEF _WIN32_WINNT >= $500} iGroupId: integer; cColumns: UINT; // tile view columns puColumns: PUINT; {$ENDIF} end; function GetDeskIcoInfo: TStringList; var dwProcessId: DWORD; hDeskTop: HWND; hProcess: THandle; lvi: tagLVITEM64A; _lv: ^tagLVITEM64A; lpvPt: Pointer; item: array[0..511] of char; _item: PChar; pt: TPoint; m_iconCount, i: Integer; lnum: SIZE_T; lstr: string; begin Result := TStringList.Create; hDeskTop := FindWindow('progman', nil); hDeskTop := FindWindowEx(hDeskTop, 0, 'shelldll_defview', nil); hDeskTop := FindWindowEx(hDeskTop, 0, 'syslistview32', nil); //获取桌面窗口bai句柄du; GetWindowThreadProcessId(hDeskTop, dwProcessId); //通过桌面窗口句柄获取此窗口所在进程的PID,其实就是explorer进程 hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId); //打开zhi指定PID进程,取得进程句柄 lpvPt := VirtualAllocEx(hProcess, nil, sizeof(TPoint), MEM_COMMIT, PAGE_READWRITE); //在指定进程里面申请一个POINI结构大小的空间. _lv := VirtualAllocEx(hProcess, nil, sizeof(tagLVITEM64A), MEM_COMMIT, PAGE_READWRITE); //在指定进程里面申请一个文本结构大小的空间. m_iconCount := ListView_GetItemCount(hDeskTop); _item := VirtualAllocEx(hProcess, nil, 512, MEM_COMMIT, PAGE_READWRITE); FillChar(lvi, 0, SizeOf(lvi)); lvi.cchTextMax := 512; for i := 0 to m_iconCount - 1 do begin //坐标 ListView_GetItemPosition(hDeskTop, i, ppoint(lpvPt)^); //获取第一个图标的坐标,存入lpvPt ReadProcessMemory(hProcess, lpvPt, @pt, sizeof(pt), lnum); //名称 lvi.iSubItem := 0; lvi.pszText := Int64(_item); WriteProcessMemory(hProcess, _lv, @lvi, sizeof(lvi), lnum); SendMessage(hDeskTop, LVM_GETITEMTEXT, INT_PTR(i), LPARAM(_lv)); ReadProcessMemory(hProcess, _item, @item[0], 512, lnum); Result.Add('名称:' + item + '->>' + '坐标:x=' + pt.X.ToString + 'y=' + pt.Y.ToString); end; VirtualFreeEx(hProcess, lpvPt, 0, MEM_RELEASE); VirtualFreeEx(hProcess, _lv, 0, MEM_RELEASE); VirtualFreeEx(hProcess, _item, 0, MEM_RELEASE); //释放申请的空间 CloseHandle(hProcess); //关闭句柄 end;
效果:
来源:https://blog.csdn.net/y281252548/article/details/109219694
Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号
执行时间: 0.035067081451416 seconds