![]() |
Textinhalt eines Objekts einer anderen Anwendung
Ich habe das Handle eines Objekts einer anderen Anwendung. Ich habe auch die Klasse etc, nun möchte ich den Inhalt speichern, wie kann ich das denn?
|
Re: Textinhalt eines Objekts einer anderen Anwendung
Was ist ein "Objekt"? Und was für ein Handle hast du?
|
Re: Textinhalt eines Objekts einer anderen Anwendung
Klassenname: RichEdit20W
Handle: 197968 Parent Handle: 1311452 Das habe ich mit WinSpy ausgelesen. Also es ist in einer anwendung eine "Memo" die TExt anzeigt. Diesen Text möchte ich speichern :D |
Re: Textinhalt eines Objekts einer anderen Anwendung
Sage doch gleich, dass du einen Fenstertext auslesen willst. Dazu gibt es im Forum wahrlich genug. Suche mal nach WM_GETTEXT.
|
Re: Textinhalt eines Objekts einer anderen Anwendung
Ich habe diese Funktion:
Delphi-Quellcode:
Gestern funktionierte Sie tadellos und jetzt nicht mehr. Ich übergebe 100%ig das richtige Handle, winspy sei dank, aber ich weis nicht an was es liegt. Am code habe ich auch nichts verändert
function GarenaRichEditText(Handle1: HWND): AnsiString;
begin SetLength(Result, SendMessage(Handle1, WM_GETTEXTLENGTH, 0, 0)+ 1); SendMessage( Handle1, WM_GETTEXT, Length(Result), cardinal(Result)); end; |
Re: Textinhalt eines Objekts einer anderen Anwendung
hast du mal geprüft was
![]() |
Re: Textinhalt eines Objekts einer anderen Anwendung
Bist du sicher, dass das Handle richtig ist?
Denn der Klassenname vom Garena Hauptfenster ändert sich jeweils. Dein Code zum Suchen des Fensters wird etwa so aussehen (Erzeugt mit WinSpy)
Delphi-Quellcode:
var
wndMain, wndChild: HWND; begin wndMain := FindWindow('Afx:00400000:b:00010011:00000006:031B08B5','Garena 2.3'); if wndMain <> 0 then begin wndChild := FindWindowEx(wndMain, 0, 'AfxMDIFrame80u', nil); wndChild := FindWindowEx(wndChild, 0, '#32770', nil); wndChild := FindWindowEx(wndChild, 0, 'RichEdit20W', nil); if wndMain <> 0 then begin ShowMessage('Window found. Handle: ' + IntToStr(wndChild)); end; end; end; Schreibe einfach mal:
Delphi-Quellcode:
Besser wäre eine EnumWindows Funktion, welche die Fenster auf Klassenname "Afx:" und den Titel auf "Garena " überprüft.
wndMain := FindWindow(nil ,'Garena 2.3');
|
Re: Textinhalt eines Objekts einer anderen Anwendung
So habe rausgefunden an was es liegt.
Ich habe ein Fenster zum senden von nachrichten, und eines in welchem die nachrichten angezeigt werden. Beide haben die gleiche Klasse etc. Nun ich finde immer zuerst das Fenster zum senden der nachrichten, sprich ich muss nun irgendwie weitersuchen sodass ich irgendwann das richtige gefunden habe. |
Re: Textinhalt eines Objekts einer anderen Anwendung
Zitat:
Delphi-Quellcode:
//...
wndChild := FindWindowEx(wndMain, 0, 'AfxMDIFrame80u', nil); wndChild := FindWindowEx(wndChild, 0, '#32770', nil); wndChild := GetDlgItem(wndChild, 162); //... |
Re: Textinhalt eines Objekts einer anderen Anwendung
Soo endlich gelöst, danke für die Hilfe, jedoch neues Problem, wer hätte es gedacht :D
Delphi-Quellcode:
Der Code funktioniert super, jedoch wenn ich Garena neustarte, verändert sich etwas kleines aber feines :D
wndMain := FindWindow('Afx:00400000:b:00010011:00000006:31F703F5','Garena 2.3');
if wndMain <> 0 then begin wndChild := GetDlgItem(wndMain, 59648); wndChild := GetDlgItem(wndChild, 59648); wndChild := GetDlgItem(wndChild, 162); if wndMain <> 0 then begin
Delphi-Quellcode:
Wie kann ich das denn nun umgehen, dass ich nicht immer mit WinSpy arbeiten muss :D
wndMain := FindWindow('Afx:00400000:b:00010011:00000006:00BE03FD','Garena 2.3');
if wndMain <> 0 then begin wndChild := GetDlgItem(wndMain, 59648); wndChild := GetDlgItem(wndChild, 59648); wndChild := GetDlgItem(wndChild, 162); if wndMain <> 0 then begin |
Re: Textinhalt eines Objekts einer anderen Anwendung
Zitat:
|
Re: Textinhalt eines Objekts einer anderen Anwendung
Und wie geht das :S :duck:
|
Re: Textinhalt eines Objekts einer anderen Anwendung
DP-Suche hilft ;)
|
Re: Textinhalt eines Objekts einer anderen Anwendung
Habe es bei SwissDelphi gefunden :D
So dann wieder eine Menge dazugelernt |
Re: Textinhalt eines Objekts einer anderen Anwendung
Zitat:
Delphi-Quellcode:
function FindGarenaMainWindow: Hwnd;
const GarenaWindowTitle = 'Garena '; GarenaClassName = 'Afx:'; var NextHandle: Hwnd; WinTitle, WinClass: array[0..255] of char; begin Result := 0; NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST); while NextHandle > 0 do begin GetWindowText(NextHandle, WinTitle, SizeOf(WinTitle)); GetClassName(NextHandle, WinClass, SizeOf(WinClass)); if (Copy(WinTitle, 1, Length(GarenaWindowTitle)) = GarenaWindowTitle) and (Copy(WinClass, 1, Length(GarenaClassName)) = GarenaClassName) then begin Result := NextHandle; Break; end else NextHandle := GetWindow(NextHandle, GW_HWNDNEXT); end; end; |
Re: Textinhalt eines Objekts einer anderen Anwendung
Danke :D aber ich hatte es schon
|
Re: Textinhalt eines Objekts einer anderen Anwendung
Zitat:
|
Re: Textinhalt eines Objekts einer anderen Anwendung
Liste der Anhänge anzeigen (Anzahl: 1)
Ich dachte die Hürden wären aus dem Weg geräumt, jedoch lag ich da falsch.
Bild s. Anhang Ich möchte gerne den Button mit der durchgestrichenen Person klicken, der neben dem Plus in der neuen kleinen Form. Das Problem, ich muss zuvor auf das kleine Anzeigefenster der Person klicken das irgendwas aktiviert wird, erst dann kann ich mit meinem Code bannen. Klicke ich nicht auf die Form wird der user "Static" gebannt, welcher gar nicht existiert :D [edit=Matze]Bild angehängt. Ein Bild dieser Auflösung und Dateigröße verursacht erstens je nach Bildschirmauflösung unschöne Scrollbalken und zweitens dauert der Seitenaufbau verhältnismäßig lange. Binde Grafiken zukünftig bitte immer als Attachment ein. MfG, Matze[/edit] |
Re: Textinhalt eines Objekts einer anderen Anwendung
push :twisted:
|
Re: Textinhalt eines Objekts einer anderen Anwendung
[quote="napsterxx"]Das Problem, ich muss zuvor auf das kleine Anzeigefenster der Person klicken das irgendwas aktiviert wird, quote]
Handelt es sich hierbei um ein Listview Control? |
Re: Textinhalt eines Objekts einer anderen Anwendung
Nein es ist eine Form also ein normales Fenster
|
Re: Textinhalt eines Objekts einer anderen Anwendung
Sende zweimal eine BM_CLICK Nachricht an den Button. Dann wird er geklickt.
(soeben erfolgreich getestet) |
Re: Textinhalt eines Objekts einer anderen Anwendung
Dann bannt er aber Static und nicht den eingegebenen User.
Delphi-Quellcode:
//EDIT
var
wndMain, wndChild: HWND; S: String; I: INteger; begin wndMain := FindGarenaMainWindow; if wndMain <> 0 then begin wndChild := GetDlgItem(wndMain, 59648); wndChild := GetDlgItem(wndChild, 59649); wndChild := GetDlgItem(wndChild, 1003); if wndMain <> 0 then begin PostMessage(wndChild, BM_CLICK, 0, 0); end; end; wndMain := FindWindow('#32770','Search a user'); if wndMain <> 0 then begin wndChild := GetDlgItem(wndMain, 1153); if wndMain <> 0 then begin s := JvListView2.Selected.Caption; for i := 1 to Length(s) do SendMessage(wndChild, WM_CHAR, Word(s[i]), 0); end; end; wndMain := FindWindow('#32770','Search a user'); if wndMain <> 0 then begin wndChild := GetDlgItem(wndMain, 1155); if wndMain <> 0 then begin PostMessage(wndChild, BM_CLICK, 0, 0); end; end; wndMain := FindWindow('#32770',''); if wndMain <> 0 then begin wndChild := GetDlgItem(wndMain, 1560); if wndMain <> 0 then begin PostMessage(wndChild, BM_CLICK, 0, 0); PostMessage(wndChild, BM_CLICK, 0, 0); end end; Ich muss das handle auf diese Anzeigeform bekommen aber ich schaffe es nciht |
Re: Textinhalt eines Objekts einer anderen Anwendung
Meinst du die Form mit der Person drauf?
Delphi-Quellcode:
FindWindowEx2:
var
wndMain, wndChild: HWND; begin wndMain := FindGarenaMainWindow; if wndMain <> 0 then begin wndChild := FindWindowEx2(wndMain,'#32770', 2); if wndMain <> 0 then begin ShowMessage('Window found. Handle: ' + IntToStr(wndChild)); FlashControl(wndChild); // internal function end; end; end;
Delphi-Quellcode:
function FindWindowEx2(hParent: HWND; ChildClassName: string; ChildNr: Word): HWND;
var i: Word; hChild: HWND; begin Result := 0; hChild := 0; Dec(ChildNr); for i := 0 to ChildNr do begin hChild := FindWindowEx(hParent, hChild, PChar(ChildClassName), nil); if hChild = 0 then Break; Result := hChild; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 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-2025 by Thomas Breitkreuz