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.33703398704529 seconds