Das ist halt immer soeine Sache.
Zitat von
GetWindowText:
The maximum number of characters to copy to the buffer, including the null character. If the text exceeds this limit, it is truncated.
Zitat von
GetWindowTextLength / WM_GETTEXTLENGTH:
The return value is the length of the text in characters, not including the terminating null character.
Der Wert gibt dort die Länge des Speichers an, inklusive der abschließenden #0.
In dem String selber ist aber kein Platz für diese letzte #0 reserviet. OK, indirekt schon, denn im Delphistring wird implizit eine #0 hinter dem Stringinhalt abgelegt.
Bei GetWindowText muß also diese zusätzliche #0 mit angegeben werden, da sonst das letzte Text-Zeichen abgeschnitten würde.
Jetzt kommt es nur noch drauf an, wohin PChar zeigt, bei einem Leer-String. (ein '' ist nil und PChar zeigt dann Ersatzweise wo anders hin, wo #0#0 im Speicher hinterlegt ist)
Bei dir war das anscheinend ein Schreibgeschützter Bereich, bzw. bei mir zufällig nicht.
Delphi-Quellcode:
SetLength(T, GetWindowTextLength(hwnd));
if T <> '' then
GetWindowText(hwnd, PChar(T), Length(T) + 1);