Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Text an Eingabezeile schicken (https://www.delphipraxis.net/34130-text-eingabezeile-schicken.html)

Aike 17. Nov 2004 21:21


Text an Eingabezeile schicken
 
Hallo Leute,

also ich hab ein bisschen gestöbert, aber nix Passendes gefunden.

Mein Problem sieht so aus, dass ich einen (vordefinierten) Text an ein Spiel (sehr alt) schicken will. Wie ich gelesen habe, geht das mit SETTEXT oder so, aber ich weiß schonmal gar nicht, wie ich das handle dieser Eingabezeile herausbekomme, konnte dazu auch nichts Sinnvolles im Forum finden (kenne mich da kaum aus). Was ich gefunden habe, war die Funktion "FindWindow", aber dazu konnte ich in der Delphi-Hilfe nichts finden und auch hier im Forum nicht.

In dieser Beziehung hab ich kaum Ahnung, also nicht hauen :zwinker:

Liebe Grüße ...

glkgereon 17. Nov 2004 21:26

Re: Text an Eingabezeile schicken
 
FindWindow(nil,'Titel der oben im fenster drinsteht');

mach ich auch grad was mit... :wink:

wie du die eingabezeile dann ansprichst...keine ahnung

achso: findwindow gibt ein THandle zurück...also:

Delphi-Quellcode:
handle:THandle;
begin
handle:=FindWindow(nil,'xyz');
danach steht das handle der anwendung bzw des fensters in handle und du kannst damit arbeiten...

Dani 17. Nov 2004 21:31

Re: Text an Eingabezeile schicken
 
Hi,

Mit Bei Google suchenWinforce kannst du den (Klassen-)Namen des gesuchten Controls und dem dazugehörigen Fenster herausfinden. Den mit MSDN-Library durchsuchenFindWindow gefundenen Handle kannst du dann an MSDN-Library durchsuchenEnumChildWindows übergeben und kommst so an den Handle des Controls.

Das funktioniert aber nur, wenn der Text deines Spiels z.B. ein Static ist. Wird der Text direkt auf die Zeichenfläche des Hauptfensters gezeichnet, kannst du mit MSDN-Library durchsuchenGetDC ein Handle für diese Zeichenfläche erstellen und dann z.B. mit MSDN-Library durchsuchenTextOut einen Text mit der aktuellen Schriftart darauf ausgeben.

Aike 17. Nov 2004 22:06

Re: Text an Eingabezeile schicken
 
Mein Kumpel meint, es sei die erste Variante.

Dazu also:
Ich habe mit EnumWindows & Co gekapselt alle Fenster auflisten lassen, allerdings zeigt es mir nur das Fenster an und kein zweites Handle für die Eingabezeile oder so. Würde es das überhaupt rausbekommen? Sieht irgendwie nicht so aus. *Grinst* :wall: Ist aber 'ne schöne Funktion :pale:

Wie ich mit EnumChildWindows umgehen kann, sagt mir die MSDN leider nicht wirklich. Ist das eine Funktion? Als was wird das Ergebnis gespeichert und wie kann ich darauf zugreifen?

Aike 18. Nov 2004 10:20

Re: Text an Eingabezeile schicken
 
Also ich bin echt am Verzweifeln. Hab mir 'ne Stunde lang im iNet und im DP-Forum Beiträge zu EnumChildWindows durchgelesen und bin kaum schlauer geworden. Von rekursivem Aufruf, Pointer und seltsamen functions hab ich was gelesen, aber das war so kompliziert, dass ich überhaupt nichts verstanden hab.
Ich will doch (vorerst) nur herausfinden, wie das handle einer Eingabezeile heißt :wiejetzt: :firejump:

Dani 18. Nov 2004 19:31

Re: Text an Eingabezeile schicken
 
Das geht wirklich einfach mit EnumChildWindows. Der Code könnte z.B. so aussehen:

Delphi-Quellcode:
//Diese funktion wird so lange von EnumChildWindows aufgerufen, bis sie FALSE zurück gibt.
function EnumTargetWindow(WindowHandle: HWND; lParam1: lParam): Boolean; stdcall;
var buf: Pchar;
    dwSize: DWORD;
    chRect: TRect;
begin
 Result := True; //Alle Fenster werden aufgelistet
 dwSize := 265;
 //Speicher für Klassenname reservieren
 buf := AllocMem(dwSize);
 //Klassenname des gefundenen Fensters speichern
 If GetClassName(WindowHandle, buf, dwSize)<>0 then
 //Wenn das Control ein "Static" ist...
 If buf='Static' then
  begin
   //Dessen Koordinaten in chRect speichern
   GetWindowRect(WindowHandle, chRect);
   ///... irgendetwas mit den ausgelesenen Daten tun
  end;
 //Allozierten Speicher freigeben
 FreeMem(buf, dwSize);
end;


procedure foo;
var TargetWnd: HWND;
begin
 TargetWnd := FindWindow('TForm1', nil);
 If TargetWnd <> 0 then
  begin
   EnumChildWindows(TargetWnd, @EnumTargetWindow, lParam(0));
  end;
end;

Aike 18. Nov 2004 21:48

Re: Text an Eingabezeile schicken
 
Wow, vielen Dank!
Aber er gibt mir diese Fehlermeldung zurück:
"@EnumTargetWindow: Variable erforderlich"
Da muss aber schon in der Deklaration stehen "From1.EnumTargetWindow(...)", oder?

Und müssen nicht bei "FindWindow('TForm1', nil);" die beiden Werte vertauscht sein?

Dani 19. Nov 2004 00:49

Re: Text an Eingabezeile schicken
 
Zitat:

Zitat von Aike
Wow, vielen Dank!
Aber er gibt mir diese Fehlermeldung zurück:
"@EnumTargetWindow: Variable erforderlich"
Da muss aber schon in der Deklaration stehen "From1.EnumTargetWindow(...)", oder?

Und müssen nicht bei "FindWindow('TForm1', nil);" die beiden Werte vertauscht sein?

EnumTargetWindow darf keine Methode von TForm1 sein, sondern sollte als globale Funktion der Unit definiert sein. Klassenmethoden haben einen versteckten Parameter (Pointer); ein Zeiger auf die aufrufende Instanz der Klasse (-> Self).

[size=3]PS: Mach in Methoden von TForm1 lieber "Self.Irgendwas" als "Form1.Irgendwas". Das ist wichtig, falls du Instanzen von TForm1 dynmisch erzeugen möchstest oder mal eine Klasse von TForm1 ableitest[/size]

Die Reihenfolge bei FindWindow ist absicht. Man sollte eigentlich nicht (nur) nach dem Fenstertitel suchen, sondern falls möglich nach dem Klassennamen. Ist der Klassenname nicht eindeutig, wird's problematisch. Sich auf den Fenstertitel zu verlassen ist ein wenig riskant, da es ein paar Programme gibt, die den Fenstertitel des aktiven Fensters verändern, was dazu führen würde, dass dein Programm es nicht mehr findet :-/

Aike 19. Nov 2004 01:01

Re: Text an Eingabezeile schicken
 
Das mit dem Pointer und so verstehe ich nicht wirklich, ist aber egal - hauptsache es funktioniert :angel2:
Wie kann ich denn die handles der ChildWindows auflisten lassen (Listbox1)?

Dani 19. Nov 2004 01:04

Re: Text an Eingabezeile schicken
 
Mit IntToStr :mrgreen:

Edit: Ist es normal, dass da ein Leerzeichen bei der Quelltext-Einrückung verschluckt wird?

Delphi-Quellcode:
function EnumTargetWindow(WindowHandle: HWND; lParam1: lParam): Boolean; stdcall;
begin
 Result := True; //Alle Fenster werden aufgelistet
 Form1.Listbox1.Items.Add(IntToStr(WindowHandle));
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 Uhr.
Seite 1 von 4  1 23     Letzte »    

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