Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Fensterinhalt eines anderen Programm übernehmen (https://www.delphipraxis.net/158856-fensterinhalt-eines-anderen-programm-uebernehmen.html)

wallwriht 5. Mär 2011 13:45

Fensterinhalt eines anderen Programm übernehmen
 
Hallo zusammen,
Ich würde gerne aus einem anderen Programm etwas übernehmen, was dort im Fenster steht oder auch den ganzen Fensterinhalt. Ich habe den Name des Fensters. Kann man irgendwie nach dem man das Fenster gefunden hat den text als string oder ähnliches bekommen?
lg
wallwriht

toms 5. Mär 2011 14:11

AW: Fensterinhalt eines anderen Programm übernehmen
 
Hallo,

Sofern das Control ein Handle besitzt mit SendMessage + WM_GETTEXT.

wallwriht 6. Mär 2011 17:20

AW: Fensterinhalt eines anderen Programm übernehmen
 
Zitat:

Zitat von toms (Beitrag 1086086)
Hallo,

Sofern das Control ein Handle besitzt mit SendMessage + WM_GETTEXT.

Meinst du erst mit findwindow das fenster als handle bekommen und dann wie weiter????

mit:

sendmessage(handle); oder wie?
lg

Luckie 6. Mär 2011 17:55

AW: Fensterinhalt eines anderen Programm übernehmen
 
Guck dir die Hilfe zu WM_GETTEXT im MSDN an (http://msdn.microsoft.com/en-us/library/default.aspx) oder such mal im Forum nach FindWindow, FindWindowEx und WM_GETTEXT.

wallwriht 6. Mär 2011 19:32

AW: Fensterinhalt eines anderen Programm übernehmen
 
Zitat:

Zitat von Luckie (Beitrag 1086264)
Guck dir die Hilfe zu WM_GETTEXT im MSDN an (http://msdn.microsoft.com/en-us/library/default.aspx) oder such mal im Forum nach FindWindow, FindWindowEx und WM_GETTEXT.

ok danke bin dran

wallwriht 7. Mär 2011 08:38

AW: Fensterinhalt eines anderen Programm übernehmen
 
Delphi-Quellcode:

procedure TForm1.Button1Click(Sender: TObject);
var
textlength: Integer;
wnd:hwnd;
pcwintext:pchar;
begin
wnd:= Findwindow(nil,'was auch immer');


Memo1.Text:=gettext(wnd);


end;






function Tform1.GetText(Wnd: HWND): string;
var
textlength: Integer;
Text: PChar;
begin
textlength := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
if textlength = 0 then Result := ''
else
begin
GetMem(Text, textlength + 1);
SendMessage(Wnd, WM_GETTEXT, textlength + 1, Integer(Text));
Result := Text;
FreeMem(Text);
end;
end;

das hab ich jtztmal klappt aber nicht in dem Sinne in dem ich es Will.
Wenn ich zB ICQ bei findwindow reinschreib kommt im Memo ICQ raus aber da soll ja der Fensterinhalt rauskommen... wie mache ich das?

DeddyH 7. Mär 2011 08:42

AW: Fensterinhalt eines anderen Programm übernehmen
 
Lad Dir WinSpy herunter und lass Dir davon den Code zum Ermitteln des richtigen Handles generieren.

wallwriht 7. Mär 2011 08:55

AW: Fensterinhalt eines anderen Programm übernehmen
 
Zitat:

Zitat von DeddyH (Beitrag 1086368)
Lad Dir WinSpy herunter und lass Dir davon den Code zum Ermitteln des richtigen Handles generieren.

Vielen dank schonmal klappt auch, ich bekomme dann eine Nummer für das Handle, wie muss ich damit weitermachen?

DeddyH 7. Mär 2011 09:40

AW: Fensterinhalt eines anderen Programm übernehmen
 
Die Nummer ist (hoffentlich) das Handle, welches Du für WM_GETTEXT verwenden kannst.

wallwriht 7. Mär 2011 10:03

AW: Fensterinhalt eines anderen Programm übernehmen
 
Zitat:

Zitat von DeddyH (Beitrag 1086398)
Die Nummer ist (hoffentlich) das Handle, welches Du für WM_GETTEXT verwenden kannst.

Gut danke....


Delphi-Quellcode:

function Tform1.GetText(Wnd: HWND): string;
var
textlength: Integer;
Text: PChar;
begin
textlength := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
if textlength = 0 then Result := ''
else
begin
GetMem(Text, textlength + 1);
SendMessage(Wnd, WM_GETTEXT, textlength + 1, Integer(Text));
Result := Text;
FreeMem(Text);
end;
end;





Das ist die Funktion mit der ich das gettext benutzen will. das Ergebnis ist aber '';
also leer.

DeddyH 7. Mär 2011 10:07

AW: Fensterinhalt eines anderen Programm übernehmen
 
Und Du hast auch ganz sicher das richtige Handle? Bist Du einmal durchgesteppt und hast Dir die aktuellen Werte angeschaut?

Luckie 7. Mär 2011 11:34

AW: Fensterinhalt eines anderen Programm übernehmen
 
Mit FindWindow findest du nur das Toplevelfenster eine Memo ist aber kein Toplevelfenster. Wenn du das Handle hast, musst du mit FindWindowEx das Handle des Childwindows finden und dieses dann für SendMessage verwenden.

DeddyH 7. Mär 2011 12:00

AW: Fensterinhalt eines anderen Programm übernehmen
 
Deshalb ja mein Tipp mit WinSpy.

wallwriht 7. Mär 2011 15:14

AW: Fensterinhalt eines anderen Programm übernehmen
 
Zitat:

Zitat von DeddyH (Beitrag 1086476)
Deshalb ja mein Tipp mit WinSpy.

Habe den Tip mit Winspy befolgt und bekomme da das childhandle in form einer Nummer raus.
Wie kann ich das zwischendrin nachkucken wie im obigen Post erwähnt?

DeddyH 7. Mär 2011 15:43

AW: Fensterinhalt eines anderen Programm übernehmen
 
Zeig einmal den Code, den WinSpy generiert hat.

wallwriht 7. Mär 2011 15:45

AW: Fensterinhalt eines anderen Programm übernehmen
 
Delphi-Quellcode:
procedure Tform1.findit;

 var
  wndMain, wndChild: HWND;
begin
  wndMain := FindWindow('ThunderRT6FormDC','ICQ Status Checker v.1.7.3');
  if wndMain <> 0 then
  begin
    wndChild := FindWindowEx(wndMain, 0, 'ThunderRT6Frame', nil);
    wndChild := FindWindowEx(wndChild, 0, 'ThunderRT6PictureBoxDC', nil);
    wndChild := FindWindowEx(wndChild, 0, 'ThunderRT6Frame', nil);
    wndChild := FindWindowEx(wndChild, 0, 'ThunderRT6PictureBoxDC', nil);
    if wndChild <> 0 then
    begin
      ShowMessage('Window Handle: ' + IntToStr(wndChild));
     // FlashControl(wndChild); // internal function
    end;
  end;

  Memo1.Text:=gettext(wndchild);
end;

DeddyH 7. Mär 2011 15:50

AW: Fensterinhalt eines anderen Programm übernehmen
 
PictureBox? Das klingt fast so, als wäre das kein WinControl in dem Sinne, sondern der Text wird zur Laufzeit "gemalt". Das ist aber nur eine Vermutung.

wallwriht 7. Mär 2011 16:50

AW: Fensterinhalt eines anderen Programm übernehmen
 
Zitat:

Zitat von DeddyH (Beitrag 1086572)
PictureBox? Das klingt fast so, als wäre das kein WinControl in dem Sinne, sondern der Text wird zur Laufzeit "gemalt". Das ist aber nur eine Vermutung.

Ok ich probier mal ein anderes Fenster



Also:

DeddyH hatte recht, das lag daran das es eine Picturebox ist. Mit nem Edit klappts super. Kann ich nicht irgendwie den Text aus ner Picturebox auch rausholen... Is ja praktisch wie ein canvas text out was ich einlesen will.....

wallwriht 8. Mär 2011 08:53

AW: Fensterinhalt eines anderen Programm übernehmen
 
Vielleicht lässt sich das auch lösen, wenn ich irgendwie die Farben in der Picturebox rausbekommen könnte, also ob es grün gibt oder ähnliches... gibt es das?

DeddyH 8. Mär 2011 09:11

AW: Fensterinhalt eines anderen Programm übernehmen
 
Ich fürchte, Du unterschätzt den Aufwand. Um den Text herauszubekommen, bräuchtest Du ja ein OCR.

wallwriht 8. Mär 2011 09:25

AW: Fensterinhalt eines anderen Programm übernehmen
 
Zitat:

Zitat von DeddyH (Beitrag 1086734)
Ich fürchte, Du unterschätzt den Aufwand. Um den Text herauszubekommen, bräuchtest Du ja ein OCR.

Ja ich weiß was du meinst und das mit der OCR ist echt zu aufwändig. Ich brauche den Text aber nicht zeingend, es reicht wenn ich weiß ob in der Picturebox eine bestimmte Farbe vorkommt....das müsste doch gehen.

DeddyH 8. Mär 2011 10:53

AW: Fensterinhalt eines anderen Programm übernehmen
 
Du könntest einen Screenshot des Controls machen und per Scanline nach der Farbe suchen. Dabei musst Du natürlich eine gewisse Farbtoleranz mit einbeziehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:17 Uhr.

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