Registriert seit: 6. Mär 2010
53 Beiträge
|
AW: Position der Icons auf dem Desktop ermitteln
21. Dez 2010, 17:19
Muss ja auch nicht umbedingt in Java sein. Delphi ist ja auch nicht schlecht. Wie heißt denn das Programm? Finde da in der List auf den ersten Blick nichts passendes. PS Habs gefunden
Das hier scheint ja das zu sein, was die Icons findet:
Code:
function GetDesktopIconInfo: TDesktopIconInfoArray;
var
ListView : HWND;
ProcessId : DWORD;
Process : THandle;
Size : Cardinal; // SIZE_T
MemLocal : PLvItemBuffer;
MemRemote : PLvItemBuffer;
NumBytes : Cardinal; // SIZE_T
IconCount : DWORD;
IconIndex : Integer;
IconLabel : string;
IconPos : TPoint;
DesktopIconInfoArray: TDesktopIconInfoArray;
begin
// Fensterhandle des Desktop-ListView ermitteln und Prozess oeffnen
ListView := GetDesktopListView;
ProcessId := 0;
GetWindowThreadProcessId(ListView, @ProcessId);
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or
PROCESS_VM_READ or PROCESS_VM_WRITE, False, ProcessId);
if Process <> 0 then
try
// Lokalen und entfernten (im Zielprozess) Puffer anlegen
Size := SizeOf(TLvItemBuffer);
MemLocal := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE);
MemRemote := VirtualAllocEx(Process, nil, Size, MEM_COMMIT, PAGE_READWRITE);
if Assigned(MemLocal) and Assigned(MemRemote) then
try
// Anzahl der Symbole ermitteln und in einer Schleife durchlaufen
IconCount := SendMessage(ListView, LVM_GETITEMCOUNT, 0, 0);
Setlength(DesktopIconInfoArray, IconCount);
for IconIndex := 0 to IconCount - 1 do
begin
// Symboltext auslesen
// (es gibt zwei identische Strukturen, jeweils eine in diesem und eine
// im Zielprozess. Wobei die Daten zwischen den Puffern hin und her
// kopiert werden muessen. Dieser Aufwand ist noetig, da LVM_GETITEM
// eine Struktur liest und schreibt, die sich im Adressraum des
// Prozesses befindet, dem das entsprechende Fenster gehoert...)
ZeroMemory(MemLocal, SizeOf(TLvItemBuffer));
with MemLocal^ do
if IsWow64Process(GetCurrentProcess) and
not IsWow64Process(Process) then
begin
LvItem64.mask := LVIF_TEXT;
LvItem64.iItem := IconIndex;
LvItem64.pszText := Cardinal(MemRemote) + ItemBufferBlockSize;
LvItem64.cchTextMax := High(MemLocal.ItemText) + 1;
end
else
begin
LvItem32.mask := LVIF_TEXT;
LvItem32.iItem := IconIndex;
LvItem32.pszText := Cardinal(MemRemote) + ItemBufferBlockSize;
LvItem32.cchTextMax := High(MemLocal.ItemText) + 1;
end;
NumBytes := 0;
if WriteProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes)
and
Boolean(SendMessage(ListView, LVM_GETITEM, 0, LPARAM(MemRemote)))
and
ReadProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes) then
begin
IconLabel := string(MemLocal.ItemText);
// Position auslesen
// (-1, -1 ist nur ein Indiz fuer einen Fehlschlag, da diese Position
// natuerlich moeglich ist...)
IconPos.X := -1;
IconPos.Y := -1;
if Boolean(SendMessage(ListView, LVM_GETITEMPOSITION, IconIndex, LPARAM(MemRemote)))
and
ReadProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes) then
begin
IconPos := PPoint(MemLocal)^;
end;
// Speichern ;)
DesktopIconInfoArray[IconIndex].Caption := IconLabel;
DesktopIconInfoArray[IconIndex].Position.X := IconPos.X;
DesktopIconInfoArray[IconIndex].Position.Y := IconPos.Y;
end;
result := DesktopIconInfoArray;
end;
except
// Exceptions ignorieren
end;
// Aufraeumen
if Assigned(MemRemote) then
VirtualFreeEx(Process, MemRemote, 0, MEM_RELEASE);
if Assigned(MemLocal) then
VirtualFree(MemLocal, 0, MEM_RELEASE);
finally
CloseHandle(Process);
end;
end;
Leider verstehe ich das kaum^^ Also anscheinend gibt es einen Prozess der das bei Windows verwaltet? Richtig? Und den kopiert er aus irgendeinem Grund in einen neuen und ließt dabei noch die Daten aus...
Geändert von eragon123 (21. Dez 2010 um 17:30 Uhr)
|