如何取得桌面上每一个图标的坐标以及序号???

解决方案 »

  1.   

    //参考如下连接
    http://www.pcvc.net/category/content.asp?sendid=122
      

  2.   

    //Demo
    uses CommCtrl;procedure TForm1.Button1Click(Sender: TObject);
    var
      hDeskTop: HWND;
      dwProcessId: DWORD;
      hProcess: THandle;
      pv: Pointer;
      pt: TPoint;
      vCardinal: Cardinal;
    begin
    (* 取桌面 ListView 的句柄 *)
      hDeskTop := FindWindow('progman', nil);
      hDeskTop := FindWindowEx(hDeskTop, 0, 'shelldll_defview', nil);
      hDeskTop := FindWindowEx(hDeskTop, 0, 'syslistview32', nil);(* 取 explorer.exe 句柄. 注意 OpenProcess 的参数 *)
      GetWindowThreadProcessId(hDeskTop, @dwProcessId);
      hProcess := OpenProcess(PROCESS_VM_READ or PROCESS_VM_OPERATION,
        False, dwProcessId);(* 在 explorer.exe 空间内分配内存 *)
      pv := VirtualAllocEx(hProcess, nil, SizeOf(TPoint), MEM_COMMIT, PAGE_READWRITE);(* 给桌面 ListView 窗口发一 LVM_GETITEMPOSITION 取 "我的电脑" 坐标 *)
      ListView_GetItemPosition(hDeskTop, 1, PPoint(pv)^);(* 把由 LVM_GETITEMPOSITION 获得的坐标数据复制到 pt 结构 *)
      vCardinal := 0;
      ReadProcessMemory(hProcess, pv, @pt, SizeOf(TPoint), vCardinal);
      Caption := Format('%d,%d', [pt.X, pt.Y]);
    (* 释放内存, 句柄 *)
      VirtualFreeEx(hProcess, pv, 0, MEM_RELEASE);
      CloseHandle(hProcess);
    end;