比如桌面上有个图标叫a.txt  如何获取这个图标的坐标?并可以更改它的坐标。怎么实现呢?请高手指教。。谢谢,200分。

解决方案 »

  1.   

    uses CommCtrl; procedure TForm1.Button1Click(Sender: TObject);
    var
      vHandle: THandle;
    var
      vItemCount: Integer;
      I: Integer;
      vBuffer: array[0..255] of Char;
      vProcessId: DWORD;
      vProcess: THandle;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
      vItem: TLVItem;
      vPoint: TPoint;
    begin
      vHandle := FindWindow('progman',   nil);
      vHandle := FindWindowEx(vHandle, 0, 'shelldll_defview', nil);
      vHandle := FindWindowEx(vHandle, 0, 'syslistview32',   nil);
      vItemCount := ListView_GetItemCount(vHandle);
      GetWindowThreadProcessId(vHandle, @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);
      try
        for I := 0 to vItemCount - 1 do
        begin
          with vItem do
          begin
            mask := LVIF_TEXT;
            iItem := I;
            iSubItem := 0;
            cchTextMax := SizeOf(vBuffer);
            pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));
          end;
          WriteProcessMemory(vProcess, vPointer, @vItem,
            SizeOf(TLVItem), vNumberOfBytesRead);
          SendMessage(vHandle, LVM_GETITEM, I, lparam(vPointer));
          ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
            @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
          if SameText('我的电脑', vBuffer) then
          begin
            ListView_GetItemPosition(vHandle, I, PPoint(vPointer)^);
            ReadProcessMemory(vProcess, vPointer, @vPoint, SizeOf(TPoint),
              vNumberOfBytesRead);
            Caption := Format('%d,%d', [vPoint.X, vPoint.Y]);
            Break;
          end;
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess);
      end;
    end; 
      

  2.   

    1楼,这段代码只能获取坐标,怎么移动图标呢?比如获取的“我的电脑”的坐标是(23,2),我想用程序把它移到(23,80),应该怎么弄?谢谢还有个头疼的问题,如果系统设置的是不显示文件的扩展名,那么用这个代码就无法识别同名的文件,比如一个mp3叫abc,一个文本文档也叫abc,应该怎么区分呢?有没有高手知道?
      

  3.   

     function   TForm1.GetDesktopHand:   THandle;   
      begin   
          Result   :=   FindWindow('progman',   nil);   
          Result   :=   GetWindow(Result,   GW_Child);   
          Result   :=   GetWindow(Result,   GW_Child);   
      end;   
        
      ListView_FindItem(hand,-1,   ItemInfo);     //查找桌面图标   
      SendMessage(Hand,   LVM_SetItemPosition,   i,   MakeLparam(X,   y));   //   设置坐标;不显示扩展名……貌似delphi有函数可以识别扩展名
    ExtractFileExt(const   FileName:string):string
    不过不知道能不能在这种条件下生效
      

  4.   

    桌面实际上就是syslistview,只要针对以上操作即可.
      

  5.   

    补充一下,发现个非常郁闷的问题,就是当一个图标名字很长的时候,比如123456789012345,windows显示的名字就是123456789... 而用DELPHI获取的也是123456789... 所以我想能不能用获取图标ID的办法?有没有高人知道,如何获取桌面图标的ID号?进而通过ID号对图标进行控制,怎么获得?期待超级高手。。
      

  6.   

    楼主你玩我们呢……
    貌似只能获得桌面图标句柄
    用ExtractAssociatedIcon可以获得句柄