delphi 获取桌面图标坐标及名称  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi 获取桌面图标坐标及名称


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;

效果:

20201022125119801.png

来源:https://blog.csdn.net/y281252548/article/details/109219694


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.035067081451416 seconds