Entwickler-Ecke

Windows API - Zeichensatzname auslesen


Crowbar - So 07.07.02 17:05
Titel: Zeichensatzname auslesen
Hallo,
ich möchte ein Programm schreiben, dass, wenn die Maus über z.B. Editierfelder, Eingabefelder, Memofelder etc. von fremden Programmen sich befindet, den Text-Font ausliest.
Mit den untenstehenden Code kann ich den unter dem Mauszeiger befindlichen Text-Font nur bedingt auslesen. Denn dies klappt leider nur z.B. mit dem gewöhnlichen Texteditor ("NotePad") oder bei dem Eingabefeld der Internetadresse im Internet-Explorer.
Aus irgendeinen Grund klappt es nicht in "grösseren" Schreibprogrammen, wie z.B. "Word" oder auch im "Delphi-Editor"!


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
Type
  pmeFont  = ^mFont;
  mFont     = record
                     szFont : tagLOGFONT;
                   end;

Var
  cp             : TPoint;
  hDefFont    : HFONT;
  hMemoEdit : HWND;
  meFont      : pmeFont;
 myHandle   : Integer;
  NameFont  : String;

Procedure TForm1.ButtonClick(Sender: TObject);
begin
   GetCursorPos(cp);
   myHandle:=WindowFromPoint(cp);

  NameFont:='kein Zeichensatzname';
   GetMem(meFont,sizeof(tagLOGFONT));
   if myHandle <> 0 then
    begin
       hMemoEdit:=GetWindow(myHandle,GW_HWNDFIRST);
       hDefFont   :=SendMessage(hMemoEdit,WM_GETFONT,0,0);
       if hDefFont <> 0 then
         begin
            GetObject(hDefFont,sizeof(tagLOGFONT),meFont);
            NameFont:='Zeichensatzname: '+meFont.szFont.lfFaceName;
         end;
    end;
  FreeMem(meFont);
end;


Hat jemand eine Idee woran dies liegen kann?
Bye Crowbar


OregonGhost - So 07.07.02 18:03

Ja. Dein Code versucht, das dem Control zugrunde liegende Font-Objekt auszulesen. Das funktioniert bei den Common Controls natürlich ohne Probleme.
Sowohl die meisten Entwicklungsumgebungen als auch die meisten Textverarbeitungen verwenden für die Texteingabe jedoch kein Standard-Control. Textverarbeitungen müssen verschiedene Schriftarten anzeigen, deshalb müssen sie das intern regeln und können nicht einfach ein Font-Objekt zuweisen. Entwicklungsumgebungen verwenden für das Syntaxhighlighting ein eigenes System, weil es z.B. mit RichEdit viel zu langsam und umständlich ist.
Vermutlich wirst du ohne weiteres also nicht die Schriftarten aus solchen Programmen auslesen können.