ikonki na pulpicie

0

witam
Chcialem sie dowiedziec, jak moge sprawdzic polozenie ikonki na pulpicie (i ustawienie jej polozenia)? czy windows uzywa w tym celu rejestru? przeszukalem caly i nic w tym stylu nie znalazlem...
z gory dziekuje za odpowiedzi.

0

Witam
Zamieszczam przykład pobrania nazw i położenia (X, Y) ikonek pulpitu:

//do uses ComCtrls, CommCtrl
procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  NewColumn: TListColumn;
  ListItem: TListItem;
  ListView: TListView;

  hProgman, hSHELLDLL_DefView, hSysListView32: THandle;
  dwSize : DWORD;
  hFileMapping: THandle;
  pItem: Pointer;
  Item: LV_ITEM;
  ItemPos: TPoint;
  IconCount: integer;
begin
  //Szukamy systemowego ListView (Pulpitu z ikonkami :))
  hProgman:= FindWindow('Progman', 'Program Manager');
  hSHELLDLL_DefView:= FindWindowEx(hProgman, 0, 'SHELLDLL_DefView', nil);
  hSysListView32:= FindWindowEx(hSHELLDLL_DefView, 0, 'SysListView32', nil);
  if hSysListView32 = 0 then //Czy znaleziono?
  begin
    MessageBox(Handle, 'Nie znaleziono ListView', 'Błąd', MB_ICONERROR);
    exit;
  end;

  dwSize:= sizeof(LV_ITEM) + sizeof(Char) * MAX_PATH;
  //Trzeba troche pamieci wspoldzielonej
  //mozna to zrobic np. tak:
  hFileMapping:= CreateFileMapping($FFFFFFFF, nil,
                                   PAGE_READWRITE, 0, dwSize, nil);
  if hFileMapping = 0 then exit;
  pItem:= MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  if pItem = nil then
  begin
    CloseHandle(hFileMapping);
    exit;
  end;

  ListView := TListView.Create(Self);
  with ListView do
  begin
    Parent := Self;
    Align := alClient;
    ViewStyle := vsReport;
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Nazwa';
    NewColumn.Width:= 250;
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Wsp. XY';
    NewColumn.Width:= 100;
  end;

  //Ile jest ikonek?
  IconCount:= SendMessage(hSysListView32, LVM_GETITEMCOUNT, 0, 0);

  //Trzeba odpowiednio zainicjowac pola struktury LV_ITEM
  //aby pobrac tekst
  ZeroMemory(pItem,sizeOf(LV_ITEM)); //Najpierw ją wyczyscimy
  Item.mask:= LVIF_TEXT	;
  Item.cchTextMax:= MAX_PATH;
  Item.pszText:= PChar(pItem) + SizeOf(LV_ITEM);
  Item.iSubItem:= 0;

  //teraz trzeba przekopiowac strukture to pamieci wspoldzielonej
  CopyMemory(pItem, @Item, SizeOf(LV_ITEM));
  if IconCount > 0 then
  begin
    for i:= 0 to IconCount - 1 do
    begin
      ListItem := ListView.Items.Add;
      //Pobierz tekst
      SendMessage(hSysListView32, LVM_GETITEMTEXT, i, Longint(pItem));
      ListItem.Caption := PChar(pItem) + SizeOf(LV_ITEM);
      //Pobiierz wspolrzedne
      //Do pobrania wspolrzednych wykorzystamy tensam obszar pamieci
      SendMessage(hSysListView32, LVM_GETITEMPOSITION, i, Longint(pItem));
      CopyMemory(@ItemPos, pItem, SizeOf(TPoint));
      ListItem.SubItems.Add(Format('X: %D Y: %D',  [ItemPos.X, ItemPos.Y]));
    end;
  end;
  //Trzeba na koniec posprzatac ;)
  UnmapViewOfFile(pItem);
  CloseHandle(hFileMapping);
end;

Ich ort! i nazwa bedzie zapisywana do dynamicznie utworzonego ListView
Jeżeli chodzi o zmianę ort! to podobnie tylko trzeba obsłużyc komunikat LVM_SETITEMPOSITION . Najlepiej zainteresuj sie komunikatami z serii LVM_
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1