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
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