Zitat:
Beim Zweiten hast du ein Array wo jedes Element direkt ein Record ist. D.h. ein Eintrag in dem Array ist SizeOf(TWindowDescr) gross. Du bekommst hier im Gegensatz zum Ersten nicht nur 4 Bytes der erst auf den Record zeigt sondern du hast direkt hier den Record liegen.
Ich habe es insoweit verstanden und hoffe das ich es jetzt richtig interpretiere.
Wenn ich kein Array von Zeigern auf den Typ des Records verwende benötige ich kein New() mehr
da ich den Record direkt zur verfügung habe.
Das bedeutet auch ich benötige ebenfalls ZeroMemory nicht mehr.
Demnach sieht mein Code nun so aus!
Delphi-Quellcode:
PWindowDescr = ^TWindowDescr;
TWindowDescr =
record
hWnd : HWND;
ProcessID : Pointer;
Title :
String;
Klass :
String;
ExeName :
String;
End;
AWindowDescr =
array of TWindowDescr;
Var
wDescr : AWindowDescr;
// Alle offene Fenster suchen.
Function GetWindowList(
var wDescr: AWindowDescr): DWORD;
Var
IntI : Integer;
// Zähler füt die Fenster Handle
h_wnd : HWND;
// Fenster Handle
Begin
// Zähler initialisieren
IntI := 0;
h_wnd := GetTopWindow(0);
// Zuweisen von 100 Array Elementen of PWindowDescr
// Zum einlesen der Fenster Handle
SetLength(wDescr, 100);
Repeat
// Wenn mehr als 100 Fenster Handle gefunden
If IntI > High(wDescr)
Then
// Array um 10 erhöhen
SetLength(wDescr, Length(wDescr) + 10);
// Fenster Handle ermitteln
h_wnd := GetWindow(h_wnd, GW_HWNDNEXT);
// Fenster Handle gefunden
If h_wnd <> 0
Then
begin
// Wert zuweisen
wDescr[IntI].hWnd := h_wnd;
// Window Informationen einlesen
GetWindowInfo(@wDescr[IntI]);
end;
// Zähler um 1 erhöhen
inc(IntI);
// Schleife durchlaufen bis kein Fenster Handle mehr existiert
until h_wnd = 0;
// Array Redimensionieren Fenster-Handle Count
SetLength(wDescr, succ(IntI));
// Ergebnis übergeben
Result := succ(IntI);
End;
Zitat:
Wieso 99? Ich verstehe es nicht. Ich weise nochmals auf den Unterschied bei den Begrifflichkeiten der Indexe und der Anzahl hin! Wenn ein Array 100 Elemente hat, dann sind die Index 0 bis 99 gültig. Da 0 auch ein gültiger Eintrag ist, wird 0 mitgezählt. Daher ist immer zu unterscheiden ob es nun um die Anzahl der Elemente geht oder um den höchsten Index. Der höchste Index ist bei einem dynamischen Array immer eins unter der Anzahl der Elemente!
Denke da reden wir aneinandner vorbei ich meinte den Index := 100 diesen nach Index := 99 ändern.. ergibt 100 elemente
Brauchen tu ich diesen aber auch nicht mehr da ich es geändert habe
SetLength(wDescr, 100);
Zitat:
Ich hatte das mit dem ^ falsch geschrieben. Ich hatte gestern an FillChar() gedacht, da wäre der Parameter kein Pointer sondern ein Var Parameter und dort wäre das ^ nötig gewesen. Bei ZeroMemory() sollte von daher das ^ auch bei einem Array Of PWindowDescr nicht nötig sein.
Ja das hatte ich bemerkt es hatte nämlich
AV's als rückgabe
Da ich nun direkt den Record einlese hat sich das erstmal erledigt aber destotrotz Danke für die Infos
kann bei erneuter verwendung dann darauf zurückgreifen (Thread als .PDF abspeichern) feine Sache.
Gruß