AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WM_GETTEXT + Unicode

Ein Thema von toms · begonnen am 22. Okt 2004 · letzter Beitrag vom 27. Okt 2004
Antwort Antwort
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#1

WM_GETTEXT + Unicode

  Alt 22. Okt 2004, 08:47
Hi,

Wie muss diese Funktion aussehen, wenn sie Unicode Strings zurückgeben sollte?

..SendMessage durch SendMessageW ersetzen und dann?

Delphi-Quellcode:
function GetWindowText(wnd: HWND): string;
var
  TextLength: Integer;
  Text: PChar;
begin
  Result := '';
  if wnd = 0 then
    Exit;
  TextLength := SendMessage(wnd, WM_GETTEXTLENGTH, 0, 0);
  if TextLength <> 0 then
  begin
    GetMem(Text, TextLength + 1);
    SendMessage(wnd, WM_GETTEXT, TextLength + 1, Integer(Text));
    Result := Text;
    FreeMem(Text);
  end;
end;
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: WM_GETTEXT + Unicode

  Alt 22. Okt 2004, 08:51
Musst du nicht die doppelte Länge an Speicher reservieren? WM_GETTEXTLENGTH gibt dochnur die Anzahl der Zeichen zurück:
Zitat:
Under certain conditions, the DefWindowProc function returns a value that is larger than the actual length of the text. This occurs with certain mixtures of ANSI and Unicode, and is due to the system allowing for the possible existence of double-byte character set (DBCS) characters within the text. The return value, however, will always be at least as large as the actual length of the text;
Aber Unicode verwendet doch 2 Byte pro Zeichen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#3

Re: WM_GETTEXT + Unicode

  Alt 22. Okt 2004, 08:57
So, habe mal ein wenig herumprobiert.
Wenn ich TextLength * 4 funktioniert's.
Stimmt's etwa so oder gibt's noch was anderes zu beachten?

Delphi-Quellcode:
function GetWindowText(wnd: HWND): WideString;
var
  TextLength: Integer;
  Text: PWideChar;
begin
  Result := '';
  if wnd = 0 then
    Exit;
  TextLength := SendMessageW(wnd, WM_GETTEXTLENGTH, 0, 0);
  if TextLength <> 0 then
  begin
    GetMem(Text, TextLength * 2 + 1);
    SendMessageW(wnd, WM_GETTEXT, TextLength + 1, Integer(Text));
    Result := Text;
    FreeMem(Text);
  end;
end;
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: WM_GETTEXT + Unicode

  Alt 22. Okt 2004, 09:03
Warum denn mal vier? Mal zwei sollte reichen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#5

Re: WM_GETTEXT + Unicode

  Alt 22. Okt 2004, 09:08
Zitat:
Warum denn mal vier? Mal zwei sollte reichen.
Hab es auch zuerst mit mal 2 ausprobiert aber hat dann den Text abgeschnitten.
Funktioniert jetzt aber seltsamerweise mit Mal 2 (hatte wohl etwas anderes noch geändert)
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: WM_GETTEXT + Unicode

  Alt 22. Okt 2004, 09:10
Zitat von toms:
Funktioniert jetzt aber seltsamerweise mit Mal 2 (hatte wohl etwas anderes noch geändert)
Hätte auch sonst mein Weltbild vom Unicode-Zeichensatz zerstört.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: WM_GETTEXT + Unicode

  Alt 22. Okt 2004, 10:28
Zitat von Luckie:
Zitat von toms:
Funktioniert jetzt aber seltsamerweise mit Mal 2 (hatte wohl etwas anderes noch geändert)
Hätte auch sonst mein Weltbild vom Unicode-Zeichensatz zerstört.
Wieso? Unicode-Zeichen sind doch mit 4 Byte definiert (ist ja mittlerweile bis #$10FFFD definiert)? Windows verwendet jedoch bis NT nur die 2-Byte-Version von Unicode 2.0. Ab 2000 werden die Strings UTF-16-Codiert definiert.
Aber alles > #$FFFD ist eh noch nicht relevant.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#8

Re: WM_GETTEXT + Unicode

  Alt 27. Okt 2004, 21:36
Zitat von Luckie:
Zitat von toms:
Funktioniert jetzt aber seltsamerweise mit Mal 2 (hatte wohl etwas anderes noch geändert)
Hätte auch sonst mein Weltbild vom Unicode-Zeichensatz zerstört.
Zitat von Bernhard Geyer:
Wieso? Unicode-Zeichen sind doch mit 4 Byte definiert (ist ja mittlerweile bis #$10FFFD definiert)?
Ihr habt beide recht und unrecht. Das Problem ist, daß es verschiedene Bereiche von Unicode gibt und auch verschiedene Kodierungsmöglichkeiten - inklusive derer die mit 8bit pro Zeichen auskommen und dennoch ÜBER 64k Zeichen darstellen können (UTF8 nämlich). Entscheidend ist *hier* aber wie Windows das kodiert und das hat Barnhard schon erläutert. Daß sie mit 4 Byte definiert sind kann ich genauso verneinen, denn in 10 Jahren sind es vielleicht bereits 8 Byte (Minimum!) - und Minimum ist hier die wichtige Angabe.

Statt es mal 2 zu nehmen sollte man IMMER sizeof(WideChar) benutzen (denn die Definition von WideChar kann sich ändern). Außerdem sollte man zur Textlänge 1 addieren für die schließende #0.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz