![]() |
Window Handle
Hallo ich möchte gerne ein Javafenster auslesen stoße aber leider dabei auf große Probleme
zur Zeit versuche ich es so
Code:
Aber wie lese ich dieses Fenster nun aus und schreibe den Inhalt in ein Memo ?// Fenster suchen. iWindow := FindWindow(nil, PChar('entsprechende Fensterbezeichnung'); // damit schreibe ich in das Editfeld des Fensters und sende es anschließend EnumChildWindows(iWindow, @EnumWindowsProc, LongWord(Edit1)); SendMessage(iWindow,WM_KEYDOWN,VK_RETURN, 0); SendMessage(iWindow,WM_KEYUP,VK_RETURN, 0) MFG: DelphiUser88 |
Re: Window Handle
Java kennt keine Fenster, wie man sie unter Windows üblicherweise kennen würde. Java zeichnet alles komplett selber. Vergleichbar mit einm TLabel aus der VCL. Dem zu folge haben sie auch keine Handles und der Zugriff mit Hilfe der Windows API-Funktionen ist nicht möglich.
|
Re: Window Handle
Hallo Michael
Das Senden funktioniert aber der Text wird in das Editfeld des Applet Fenster (Chat) geschrieben und anschließend gesendet Wenn dieser nun im Fenster zusehen ist möchte ich ihn wieder auslesen und in ein Memo schreiben geht das ? |
Re: Window Handle
Welche URL betrifft es denn?
|
Re: Window Handle
URL tut nichts zur Sache hier noach einmal der gesamte Code
Delphi-Quellcode:
Wie schon erwähnt das senden funktioniert nur wie Auslesen ?// globale Variablen searchNr : Integer; gewuenschteNr : Integer; iWindow : THandle; function EnumWindowsProc(Handle: THandle; Edit: TEdit): Boolean; stdcall; begin if Assigned(Edit) and (searchNr = gewuenschteNr) then begin SendMessage(Handle, WM_SETTEXT, 0, integer(PChar(Edit.Text))); Result := false; end else begin Result := true; Inc(searchNr); end; end; //--------------------------------------------------------------------------------- procedure TForm1.SendBtnClick(Sender: TObject); begin // Fenster suchen. iWindow := FindWindow(nil, PChar('entsprechende Fensterbezeichnung'); searchNr := 0; gewuenschteNr := 5; // damit schreibe ich in das Editfeld des Fensters und sende es anschließend EnumChildWindows(iWindow, @EnumWindowsProc, LongWord(Edit1)); SendMessage(iWindow,WM_KEYDOWN,VK_RETURN, 0); SendMessage(iWindow,WM_KEYUP,VK_RETURN, 0); end; |
Re: Window Handle
setzen: WM_SETTEXT
Text auslesen... WM_GETTEXT |
Re: Window Handle
Danke Toms für die schnelle Antwort bekomme ich aber leider nicht hin :(
|
Re: Window Handle
Zitat:
|
Re: Window Handle
Wie gesagt möchte ja das Fenster auslesen und in ein Memo übertragen also hab ich die Funktion verändert
Delphi-Quellcode:
Bin ich den jetzt überhaupt auf dem richtigen Wege :-D
/----------------------
function GETTXT(Handle: THandle; Memo: TMemo): Boolean; stdcall; begin if Assigned(Memo) and (searchNr = gewuenschteNr) then begin SendMessage(Handle, WM_GETTEXT, 0, Integer(PChar(Memo.Text))); Result := false; end else begin Result := true; Inc(searchNr); end; end; //----------------------- procedure TForm1.GetTextBtnClick(Sender: TObject); begin // Fenster suchen. iWindow := FindWindow(nil, PChar('entsprechende Fensterbezeichnung'); searchNr := 0; gewuenschteNr := 5; // jetzt möchte ich aber Auslesen und in Memo1 schreiben EnumChildWindows(iWindow, @EnumWindowsProc, LongWord(Memo1.Text)); SendMessage(iWindow,WM_KEYDOWN,VK_RETURN, 0); SendMessage(iWindow,WM_KEYUP,VK_RETURN, 0); end; |
Re: Window Handle
keiner eine Idee ?
|
Re: Window Handle
Du hast es doch schon da steheN.
Delphi-Quellcode:
Was willst du denn noch?
if Assigned(Memo) and (searchNr = gewuenschteNr) then
begin SendMessage(Handle, WM_GETTEXT, 0, Integer(PChar(Memo.Text))); Result := false; end |
Re: Window Handle
Delphi-Quellcode:
procedure TForm1.GetTextBtnClick(Sender: TObject); begin // Fenster suchen. iWindow := FindWindow(nil, PChar('entsprechende Fensterbezeichnung'); searchNr := 0; gewuenschteNr := 5; // ab hier möchte ich den Inhalt des Javafensters in ein Memo auf der Form schreiben also Memo.Lines.add wie setz ich das jetzt um ? |
Re: Window Handle
Ja, was meinst du, was der Quellcode macht?
|
Re: Window Handle
eben nicht ins memo schreiben warum auch immer
Delphi-Quellcode:
jetzt möchte ich aber das der Chatfensterinhalt (Text) diesmal (gewuenschteNr := 3) mit der Funktion GETTXT ausgelesen wird und in mein Memo1 auf meiner Form übergeben wird und das versuche ich die ganze zeit so // globale Variablen searchNr : Integer; gewuenschteNr : Integer; iWindow : THandle; function EnumWindowsProc(Handle: THandle; Edit: TEdit): Boolean; stdcall; begin if Assigned(Edit) and (searchNr = gewuenschteNr) then begin SendMessage(Handle, WM_SETTEXT, 0, integer(PChar(Edit.Text))); Result := false; end else begin Result := true; Inc(searchNr); end; end; //--------------------------------------------------------------------------------- procedure TForm1.SendBtnClick(Sender: TObject); begin // Fenster suchen. iWindow := FindWindow(nil, PChar('entsprechende Fensterbezeichnung'); searchNr := 0; gewuenschteNr := 5; //Editfeld vom Chatfenster (Handle) // damit sende ich den Text der bei mir im Edit1 steht an das Editfeld des Chatfensters und betätige dann die Entertaste // das funktioniert ja auch und der text wird gesendet EnumChildWindows(iWindow, @EnumWindowsProc, LongWord(Edit1)); SendMessage(iWindow,WM_KEYDOWN,VK_RETURN, 0); SendMessage(iWindow,WM_KEYUP,VK_RETURN, 0); end;
Delphi-Quellcode:
function GETTXT(Handle: THandle; Memo: TMemo): Boolean; stdcall; begin if Assigned(Memo) and (searchNr = gewuenschteNr) then begin SendMessage(Handle, WM_GETTEXT, 0, integer(PChar(Memo.Text))); Result := false; end else begin Result := true; Inc(searchNr); end; end; //--------------------------------------------------------------------------------- procedure TForm1.GetTXTBtnClick(Sender: TObject); begin // Fenster suchen. iWindow := FindWindow(nil, PChar('entsprechende Fensterbezeichnung'); searchNr := 0; gewuenschteNr := 3; //Memo (Chattext) vom Chatfenster (Handle) //so und ab hier gibt es Probleme ich weiß nicht genau wie ich die Funktion GETTXT aufrufen muss damit der Chatinhalt in mein Memo //geschrieben wird end; |
DP-Maintenance
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Windows API / MS.NET Framework API" verschoben.
|
Re: Window Handle
Es gruselt mich. Habt ihr mal im MSDN geschaut wie die Parameter für wm_gettext lauten? Anstelle des Pointers auf den Buffer übergebt Ihr 0, und anstelle der maximal möglichen Länge des Buffers übergebt ihr die Adresse von Memo1.text.
Da "Text" ein Property ist geht derdirekte zugriff gar nicht sondern es muss auf eine zwischenvariable ![]() Ihr könnt aber auch gleich die Funktion GetWindowText nehmen, da haben die Parameter schon die richtigen Namen so das es dort einleuchtender sein sollte was ihr bisher falsch gemacht habt. [Edit]
Delphi-Quellcode:
wenn du unbedingt SendMessage verwenden willst dann so:
var lBuffer: String;
lSize : Integer; begin SetLength(lBuffer, 255); lSize := GetWindowText(Handle, @lBuffer[1], Length(lBuffer)); Memo1.Text := copy(lBuffer, 1, lSize);
Delphi-Quellcode:
[/Edit]
var lBuffer: String;
lSize : Integer; begin SetLength(lBuffer, 255); lSize := SendMessage(Handle, WM_GETTEXT, Length(lBuffer), Integer(@lBuffer[1])); Memo1.Text := copy(lBuffer, 1, lSize); |
Re: Window Handle
GetWindowText geht aber nur im eigenen Prozess:
Zitat:
|
Re: Window Handle
Ich hab die Erfahrung gemacht das GetWindowText auch für andere Prozesse funktioniert. War aber vermutlich früher mal anders und daher dieser Hinweis. Ansonsten hab ichs grad nochmal mit SendMessage ergänzt.
|
Re: Window Handle
Dazu noch in der Remarkssection:
Zitat:
|
Re: Window Handle
ok, dann würde man aber gar nicht ran kommen, auch nicht mit SendMessage außer man pflanzt sich in den anderen Prozess ein.
|
Re: Window Handle
Dazu ist doch WM_GETTEXT da.
|
Re: Window Handle
Funktioniert nicht er schreibt mir die Bezeichnung des Programmes selber (Caption) ins Memo aber nicht den Inhalt des Chatfensters Ich brauch ja dazu das richtige Handle in dem Falle gewuenschteNr := 3; //Memo (Chattext)
Beim Text senden habe ich es ja ins Handle gewuenschteNr := 5; //Editfeld vom Chatfenster geschrieben mit EnumChildWindows(iWindow, @EnumWindowsProc, LongWord(Edit1)); Jetzt aber muss der Text aus der Funktion GETTXT in dem Handle gewuenschteNr := 3; //Memo (Chattext) empfangen werden und ins Memo1 rein geht das vielleicht in der Variante die du wählst umzusetzen ? |
Re: Window Handle
ok, jetzt beim erneuten Lesen hab ichs begriffen. WM_GETTEXT liefert immer den Text. GetWindowText liefert nur den Text wenn es im eigenen Prozess ist das Handle, ansonsten wird die Caption zurück geliefert.
|
Re: Window Handle
vielleicht wäre ja in dem entsprechenden Fenster (gewuenschteNr := 3) alles markieren und kopieren eine Lösung zumindest wäre der Text dann ersteinmal im Zwischenspeicher würde das gehen ? ich weis ist keine saubere Lösung
|
Re: Window Handle
Wenn euch noch interessieren sollte wie ich das entsprechne handle rausbekomme dann schaut euch diese Funktion an
Delphi-Quellcode:
testen könnt ihr das auf function HandlePrint(Handle: THandle; dat: LongWord): Boolean; stdcall; begin // zeigt die Handles direkt im Chatfensters an SendMessage(Handle, WM_SETTEXT, 0, Integer(PChar('Gewuenschte Handle ist: ' + IntToStr(searchNr)))); Inc(searchNr); // weiter um alles Handles rauszufinden Result := true; end; //---------------------------------- procedure TForm1.ButtonClick(Sender: TObject); begin iWindow := FindWindow(nil, PChar('Raum plauderecke')); //Name des Chatfensters searchNr := 0; // zeigt die handles des Chatfensters an if iWindow <> 0 then EnumChildWindows(iWindow, @HandlePrint, 0); end; ![]() |
Re: Window Handle
WM_GETTEXT wird von dem Chat-Memo Fenster (SunAwtCanvas Klasse) nicht unterstuetzt.
|
Re: Window Handle
Also ich habe jetzt das entsprechende Chatfenster (Nicht spinchat) mit WinSpy analysiert folgende Fenster gibt es
Klasse: RichEdit20W Klasse: Edit Klasse: ListBox das RichEdit denk ich wird wohl das Chatfenster sein Edit das Eingabefeld und ListBox die Userliste also muss ich mit WM_GETTEXT über meine Funktion GETTXT wohl das Richedit auslesen vielleicht könnt ihr damit was anfangen und mir doch noch helfen :-D |
Re: Window Handle
Hat denn keiner weitere Lösungsvorsachläge ?
|
Re: Window Handle
Moin Delphiuser,
Du könntest das so machen: In der EnumChildWindows-Routine prüfst Du zu jedem Handle mit ![]() ![]() |
Re: Window Handle
Hallo Christian danke für die schnelle Hilfe. Leider weis ich nicht genau wie ich das mit GetClassName umsetzen soll. Eigentlich befinde ich mich ja in der Funktion GETTXT schon im richtigen Fenster
Delphi-Quellcode:
// globale Variablen
searchNr : Integer; gewuenschteNr : Integer; iWindow : THandle; function GETTXT(Handle: THandle; RichEdit: TRichEdit): Boolean; stdcall; begin if Assigned(RichEdit) and (searchNr = gewuenschteNr) then begin SendMessage(Handle, WM_GETTEXT, 0, integer(PChar(RichEdit.Text))); Result := false; end else begin Result := true; Inc(searchNr); end; end; ich muss denk ich mal nur mit
Delphi-Quellcode:
MFG: DelphiUser
EnumChildWindows(iWindow, @GETTXT,//hier weis ich nicht weiter den Inhalt in ein Memo oder Richedit schreiben
|
Re: Window Handle
Moin DelphiUser,
die Routine, die von EnumChildWindows aufgerufen wird (in Deinem Falle HandlePrint) wird für alle ChildWindows von iWindow aufgerufen, und erhält im Parameter Handle das Handle des jeweiligen Controls. Dies geschieht solange, bis entweder alle ChildWindows durchgegangen wurden, oder bis die Funktion False zurückliefert. Mit dem übergebenen Handle, kannst Du nun prüfen, ob es die richtige Klasse hat.
Delphi-Quellcode:
(ich hoffe das stimmt so, ich habe es hier direkt reingetippt).
// Das müsste in Dein HandlePrint eingebaut werden.
const _sClass = 'RichEdit20W'; var pcClass : PChar; iLen : integer; begin iLen := length(_sClass)+1; pcClass := AllocMem(iLen); try if GetClassName(Handle,pcClass,iLen) > 0 then begin if trim(pcClass) = _sClass then begin // Der Text kann ausgelesen werden, da die Klasse stimmt. Result := false; end; end; finally FreeMem(pcClass,iLen); end; end; Das Auslesen des Textes müsste allerdings auch etwas anders vonstatten gehen, als Du es geschrieben hast: Du weisst ja gar nicht, wieviel in dem Richedit steht. Hierzu müsstest Du erst einmal ermitteln wie lang der Inhalt ist (WM_GETTEXTLENTH), bevor Du den Inhalt auslesen kannst
Delphi-Quellcode:
var
iTextLen : integer; pcBuf : PChar; begin iTextLen := SendMessage(Handle,WM_GETTEXTLENGTH,0,0) + 1; // +1 für die abschliessende #00 pcBuf := AllocMem(iTextLen); try SendMessage(Handle,WM_GETTEXT,iTextLen,lParam(pcBuf)); RichEdit.Text := trim(pcBuf); finally FreeMem(pcBuf,iTextLen); end; end; |
Re: Window Handle
Hallo Christian es funktioniert vielen vielen DANK für deine Hilfe
MFG: DelphiUser |
Re: Window Handle
Hallo Christian mit der Klasse RichEdit20W funktioniert das auslesen.
Wenn ich aber die Klasse ListBox
Delphi-Quellcode:
const
_sClass = 'ListBox'; auslesen möchte geht es nicht mehr. Woran kann es liegen ? |
Re: Window Handle
|
Re: Window Handle
DANKE
|
Re: Window Handle
Hallo funktioniert doch nicht so recht das auslesen von Klasse ListBox
Delphi-Quellcode:
function HListBox(Handle: THandle; dat: LongWord): Boolean;
stdcall; const sKlasse = 'ListBox'; //Klasse ListBox var cKlasse,cBuffer: PChar; iLaenge,iTextlaenge: Integer; begin iLaenge := length(sKlasse)+1; cKlasse := AllocMem(iLaenge); try if GetClassName(Handle,cKlasse,iLaenge) > 0 then begin if trim(cKlasse) = sKlasse then begin iTextlaenge := SendMessage(Handle,LB_GETTEXTLEN,0,0) + 1; cBuffer := AllocMem(iTextlaenge); try SendMessage(Handle,LB_GETTEXT,iTextlaenge,lParam(cBuffer)); Form1.ListBox1.Items.Text := trim(cBuffer); finally FreeMem(cBuffer,iTextlaenge); end; Result := false; end; end; finally FreeMem(cKlasse,iLaenge); end; end; Ich möchte den gesamten Inhalt der Klasse Listbox auslesen über die Klasse "RichEdit20W" und WM_GETEXT geht es. Ich könnte natürlich auch die Items über eine Schleife auslesen und dann in meiner per ListBox1.Items.add schreiben wie es ![]() Wo liegt der Fehler ? |
Re: Window Handle
Moin DelphiUser,
Zitat:
Dazu ermittelst Du mit ![]() Der Fehler den Du gemacht hast: wParam bei ![]() |
Re: Window Handle
Hallo Christian ersteinmal wieder ein DANKE für die schnelle Hilfe und das du mit mir nicht die Geduld verlierst :-D Ich habe es jetzt so umgebaut das per Schleife die Items ausgelesen werden und anschließend in ListzBox1.Items.Add übertragen werden.Es werden auch Einträge in der ListBox1 geschrieben nur scheinbar sind diese Kryptisch dargestellt oder was auch immer hier noch mal die Funktion vielleicht siehst du den Fehler
Delphi-Quellcode:
MFG: DelphiUserfunction HListBox(Handle: THandle; dat: LongWord): Boolean; stdcall; const sKlasse = 'ListBox'; //Klasse ListBox var sTXT: String; cKlasse,cBuffer: PChar; iLaenge,iTextlaenge,iCount,i: Integer; begin iLaenge := length(sKlasse)+1; cKlasse := AllocMem(iLaenge); try if GetClassName(Handle,cKlasse,iLaenge) > 0 then begin if trim(cKlasse) = sKlasse then begin iCount := SendMessage(Handle, LB_GETCOUNT, 0, 0); try for i := 0 to iCount -1 do begin iLaenge := SendMessage(Handle, LB_GETTEXTLEN, i, 0); GetMem(cBuffer, iLaenge + 1); SendMessage(Handle, LB_GETTEXT, i, Integer(cBuffer)); sTXT := StrPas(cBuffer); Form1.ListBox1.Items.Add(sTXT); end; finally FreeMem(cBuffer,iTextlaenge); end; Result := false; end; end; finally FreeMem(cKlasse,iLaenge); end; end; |
Re: Window Handle
Moin DelphiUser,
Was mir auffällt: Der Typ des Rückgabewertes der Funktion sollte Longbool sein, da das BOOL der Windows-API dem Longbool in Delphi entspricht. (auch wenn das keine Auswirkungen auf das Füllen der ListBox hat) Du produzierst aber ein Speicherleck, da Du in der Schleife immer wieder neu Speicher reservierst, ihn aber erst nach der Schleife wieder freigibst. Der Resourcenschutzblock sollte immer so verwendet werden:
Delphi-Quellcode:
In der Schleife verwendest Du iLaenge für die einzelnen Items (ausser bei der Freigabe des Speichers), dies sollte wohl aber iTextLaenge sein.
//Resource belegen (hier GetMem).
try // Mach was mit der Resource finally // Gib die Resource wieder frei (hier FreeMem) end; Ausserdem kannst Du Dir das StrPas sparen, und direkt cBuffer hinzufügen. |
Re: Window Handle
Funktioniert auch damit nicht er füllt zwar die ListBox1 also 12 Einträge sind in dem Fremdfenster drin und auch 12 Einträge macht er dann in ListBox1 aber er stellt diese so da
8¥'\ HK&\ 8+\ 8¥'\% HK&\% 8¥'\% HK&\% HK&\$ 8+\$ HK&\$ 8+\$ HK&\$ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz