[C++Builder, ASM, Delphi] Ustawienie ikon na pulpicie

0

Witam!
Chciałem napisać program podobny do tego, jaki jest dostarczany z kartami graficznymi Matroxa. Otóż zapamiętuje on położenie ikon na pulpicie i po nieprawidłowym wyjściu z Windows (na przykład po kopnięciu w guzik reset ;) ) ustawia je tak, jak były tuż przed niefortunnym wypadkiem.
Napisałem taki oto kod:
&ltfont face="Courier New"&gt
bool __stdcall CallBackFunc(HWND hwnd, LPARAM lParam)
{char nazwa[200];
GetClassName(hwnd, nazwa, 199);
if (!strcmp(nazwa, "SysListView32"))
{Uchwyt = hwnd;
return false;
}
return true;
}
*---------------------------------------------------------------------------
void __fastcall TForm1::ZapamietajClick(TObject *Sender)
{LV_ITEM item;
int index;
POINT pt;
char nazwa[256];
handle = FindWindow("Progman", NULL); *"Program Manager"
if (handle)
EnumChildWindows(handle, (WNDENUMPROC)CallBackFunc,1);
if (Uchwyt)
while ((index = SendMessage(Uchwyt, LVM_GETNEXTITEM, 1, LVNI_ALL)) != -1)
{SendMessage(Uchwyt, LVM_GETITEMPOSITION, index, long(&pt));
item.iItem = index;
item.iSubItem = 0;
item.pszText = nazwa;
item.cchTextMax = 255;
SendMessage(Uchwyt, LVM_GETITEM, 0, long(&item));
Memo1-&gtLines-&gtAdd(item.pszText);
Memo1-&gtLines-&gtAdd("index: " + IntToStr(index));
Memo1-&gtLines-&gtAdd("X = " + IntToStr(pt.x) + "Y = " + IntToStr(pt.y));
Memo1-&gtLines-&gtAdd("-----------------");
}
}
&lt/font&gt
Jest to tylko zarys (ten fragment z Memo1 jest tylko do testów).
No i czas na pytanie:
Każda próba wysłania komunikatu via SendMessage do ListView (czyli pulpitu) kończy się wykonaniem nieprawidłowej operacji przez explorer. Jeśli tylko zmienię uchwyt na inny obiekt ListView (np. w drugim programie odpalonym w tle) to wszystko jest w porządku. Czekam na propozycje...

--
"Imagination is more important than knowledge." - A. Einstein

0

procedurka zapamietujaca polozenie ikon na pulpicie

type
PInfo = ^TInfo;
TInfo = packed record
infoPoint: TPoint;
infoText: array[0..255] of Char;
infoItem: TLVItem;
infoFindInfo: TLVFindInfo;
end;
{...}
var
Info: PInfo;
IniFile: TRegIniFile;
Wnd: HWnd;
Count, I: Integer;
SharedMem: TSharedMem;
begin
Wnd := FindWindowEx(GetDesktopWindow, 0, 'Progman', 'Program Manager');
Wnd := FindWindowEx(Wnd, 0, 'SHELLDLL_DefView', nil);
Wnd := FindWindowEx(Wnd, 0, 'SysListView32', nil);
Count := ListView_GetItemCount(Wnd);
SharedMem := TSharedMem.Create('', SizeOf(TInfo));
Info := SharedMem.Buffer;
with Info^ do
try
infoItem.pszText := infoText;
infoItem.cchTextMax := 255;
infoItem.mask := LVIF_TEXT;
IniFile := TRegIniFile.Create('Software\YaddaYadda');
try
with IniFile do
begin
EraseSection('Desktop' + CurRes);
for I := 0 to Count - 1 do
begin
infoItem.iItem := I;
try
ListView_GetItem(Wnd, infoItem);
ListView_GetItemPosition(Wnd, I, infoPoint);
WriteString('Desktop' + CurRes, infoText, Format('%.4d, %.4d', [Point.X, Point.Y]));
except
end;
end;
end;
finally
IniFile.Free;
end;
finally
SharedMem.Free;
end;
end

od razu mowie, ze nie testowalem

0

eee, to nie działa! Powód: Messagi ListView są dobre, ale w obrębie jednego procesu, przez tzw. alokację pamięci. mam na to rozwiązanie, ale cholernie trudne. Jak chcesz to na maila mogę podesłać... od razu mówie: sprawdzone i działa na WinXP oraz 98

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