Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Textinhalt eines Objekts einer anderen Anwendung (https://www.delphipraxis.net/112997-textinhalt-eines-objekts-einer-anderen-anwendung.html)

napsterxx 30. Apr 2008 20:18


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?

Apollonius 30. Apr 2008 20:20

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Was ist ein "Objekt"? Und was für ein Handle hast du?

napsterxx 30. Apr 2008 20:23

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

Apollonius 30. Apr 2008 20:24

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.

napsterxx 1. Mai 2008 08:33

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Ich habe diese Funktion:
Delphi-Quellcode:
function GarenaRichEditText(Handle1: HWND): AnsiString;
begin
  SetLength(Result, SendMessage(Handle1, WM_GETTEXTLENGTH, 0, 0)+ 1);
  SendMessage( Handle1, WM_GETTEXT, Length(Result), cardinal(Result));
end;
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

himitsu 1. Mai 2008 09:16

Re: Textinhalt eines Objekts einer anderen Anwendung
 
hast du mal geprüft was MSDN-Library durchsuchenGetLastError sagt?

toms 1. Mai 2008 09:18

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:
wndMain := FindWindow(nil ,'Garena 2.3');
Besser wäre eine EnumWindows Funktion, welche die Fenster auf Klassenname "Afx:" und den Titel auf "Garena " überprüft.

napsterxx 1. Mai 2008 09:20

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.

toms 1. Mai 2008 09:24

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Zitat:

Zitat von napsterxx
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.

So findest du das richtige RichEdit

Delphi-Quellcode:
    //...
    wndChild := FindWindowEx(wndMain, 0, 'AfxMDIFrame80u', nil);
    wndChild := FindWindowEx(wndChild, 0, '#32770', nil);
    wndChild := GetDlgItem(wndChild, 162);
    //...

napsterxx 1. Mai 2008 10:00

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:
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
Der Code funktioniert super, jedoch wenn ich Garena neustarte, verändert sich etwas kleines aber feines :D

Delphi-Quellcode:
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
Wie kann ich das denn nun umgehen, dass ich nicht immer mit WinSpy arbeiten muss :D

himitsu 1. Mai 2008 10:05

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Zitat:

Zitat von toms
Denn der Klassenname vom Garena Hauptfenster ändert sich jeweils.

...

Besser wäre eine EnumWindows Funktion, welche die Fenster auf Klassenname "Afx:" und den Titel auf "Garena " überprüft.


napsterxx 1. Mai 2008 10:15

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Und wie geht das :S :duck:

Die Muhkuh 1. Mai 2008 10:23

Re: Textinhalt eines Objekts einer anderen Anwendung
 
DP-Suche hilft ;)

napsterxx 1. Mai 2008 10:27

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Habe es bei SwissDelphi gefunden :D

So dann wieder eine Menge dazugelernt

toms 1. Mai 2008 10:33

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Zitat:

Zitat von napsterxx
Und wie geht das :S :duck:


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;

napsterxx 1. Mai 2008 10:42

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Danke :D aber ich hatte es schon

toms 1. Mai 2008 10:50

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Zitat:

Zitat von napsterxx
Danke :D aber ich hatte es schon

Du schon aber vielleicht kann den Code ja mal jemand anders gebrauchen.

napsterxx 1. Mai 2008 23:36

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]

napsterxx 2. Mai 2008 20:33

Re: Textinhalt eines Objekts einer anderen Anwendung
 
push :twisted:

toms 2. Mai 2008 20:48

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?

napsterxx 2. Mai 2008 21:15

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Nein es ist eine Form also ein normales Fenster

toms 3. Mai 2008 07:51

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Sende zweimal eine BM_CLICK Nachricht an den Button. Dann wird er geklickt.
(soeben erfolgreich getestet)

napsterxx 3. Mai 2008 12:21

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Dann bannt er aber Static und nicht den eingegebenen User.

Delphi-Quellcode:
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;
//EDIT
Ich muss das handle auf diese Anzeigeform bekommen aber ich schaffe es nciht

toms 3. Mai 2008 14:30

Re: Textinhalt eines Objekts einer anderen Anwendung
 
Meinst du die Form mit der Person drauf?

Delphi-Quellcode:
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;
FindWindowEx2:

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