Das SizeOf bei GetWindowText ist falsch. Die Funktion möchte die maximale Anzahl an Zeichen (Char) haben und nicht die Byte-Größe (Quelle
MSDN: "The maximum number of characters to copy to the buffer").
Mit SizeOf(Buf) bekommst du ab Delphi 2009 (
Unicode) die doppelte Anzahl zurück, da SizeOf(Char) = 2 ist und somit "257*2" zurückkommt. GetWindowText möchte aber nicht die Byte-Größe, sondern die "Anzahl der verfügbaren Zeichen". Und die ermittelt man über Length.