就是说桌面的每一个图标的座标保存为文件.下次可以还原每个图标的座标.
网上有个DLL的.但是没有源码....这样难做到吗?

解决方案 »

  1.   

    桌面是一个SysListView32控件
    对应VCL中的TListView,只要参考VCL中的实现即可读取控制
    当然需要跨进程访问参考如下代码:function GetListViewText( // 取得其他进程中ListView的内容
      mHandle: THandle; // ListView句柄
      mStrings: TStrings // 输出的字符串集对象
    ): Boolean; // 返回获取是否成功
    var
      vColumnCount: Integer;
      vItemCount: Integer;
      I, J: Integer;
      vBuffer: array[0..255] of Char;
      vProcessId: DWORD;
      vProcess: THandle;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
      S: string;
      vItem: TLVItem;
      vLVColumn: TLVColumn;
    begin
      Result := False;
      if not Assigned(mStrings) then Exit;
      vItemCount := ListView_GetItemCount(mHandle);
      if vItemCount <= 0 then Exit;
      Delete(S, 1, 1);
      GetWindowThreadProcessId(mHandle, @vProcessId);
      vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
        PROCESS_VM_WRITE, False, vProcessId);
      vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
        PAGE_READWRITE);
      mStrings.BeginUpdate;
      try
        mStrings.Clear;
        ///////Begin 计算分栏
        S := '';
        vColumnCount := 0;
        vLVColumn.mask := LVCF_TEXT;
        vLVColumn.pszText := Pointer(Cardinal(vPointer) + SizeOf(vLVColumn));
        vLVColumn.cchTextMax := SizeOf(vBuffer);
        WriteProcessMemory(vProcess, vPointer, @vLVColumn,
          SizeOf(vLVColumn), vNumberOfBytesRead);
        while BOOL(SendMessage(mHandle, LVM_GETCOLUMN,
          vColumnCount, Longint(vPointer))) do
        begin
          ReadProcessMemory(vProcess, vLVColumn.pszText,
            @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
          S := S + #9 + vBuffer;
          Inc(vColumnCount);
        end;
        vColumnCount := Max(vColumnCount, 1);
        ///////End 计算分栏
        Delete(S, 1, 1);
        if S <> '' then mStrings.Add(S);
        for I := 0 to vItemCount - 1 do begin
          S := '';
          for J := 0 to vColumnCount - 1 do begin
            with vItem do begin
              mask := LVIF_TEXT;
              iItem := I;
              iSubItem := J;
              cchTextMax := SizeOf(vBuffer);
              pszText := Pointer(Cardinal(vPointer) + SizeOf(vItem));
            end;
            WriteProcessMemory(vProcess, vPointer, @vItem,
              SizeOf(TLVItem), vNumberOfBytesRead);
            SendMessage(mHandle, LVM_GETITEM, I, lparam(vPointer));
            ReadProcessMemory(vProcess, vItem.pszText,
              @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
            S := S + #9 + vBuffer;
          end;
          Delete(S, 1, 1);
          mStrings.Add(S);
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess);
        mStrings.EndUpdate;
      end;
      Result := True;
    end; { GetListViewText }
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ListView1.Items[0].Position := Point(100, 100);
    end;procedure ListView_SetItemPosition32(hwndLV: HWND; i, x, y: Integer);
    var
      ptNewPos: TPoint;
    begin
      ptNewPos.x := x;
      ptNewPos.y := y;
      SendMessage(hwndLV, LVM_SETITEMPOSITION32, i, Longint(@ptNewPos));
    end;