Entwickler-Ecke
Windows API - Werte aus einem Fenster auslesen
Rupert - Do 17.11.11 14:03
Titel: Werte aus einem Fenster auslesen
Problem:
Es läuft eine Software, die mir eine Zahlentabelle (siehe Bild) liefert. Diese Werte will ich aber auslesen und weiter verarbeiten.
Durch X-Spy sehe ich, dass das Fenster ein TBGrid ist.
(Die Software wurde von jemanden in Delphi programmiert).
Ich bin so weit, dass ich mir das Fenster in eine Position schiebe und die Felder fokussiere.
Mir ist aber nicht klar, wie ich die Inhalte lesen kann. Klickt man auf die Tabellenfelder, dann sind sie selektiert und grün hinterlegt.
Hier die Routine, die mir das Fenster positioniert und die Schleife, die eine Zeile selektiert. Das Kommando zum Auslesen der Werte fehlt noch.
Weiß jemand wie das geht?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure TForm1.Button1Click(Sender: TObject);
begin begin hFenster :=FindWindow('TfrmStatistics', 'Statistik'); if hFenster <> 0 then MoveWindow(hFenster, -1600, 0, 698, 478, true) else halt; end; randomize;
x:=mouse.CursorPos.X; y:=mouse.CursorPos.Y;
hFenster :=FindWindow('TdxDBGrid', 'Statistik');
for i:=0 to 17 do begin Klicke_auf (-1490+(i*30),376); getWindowText(hfenster,pchar(StringGrid1.Cells[1+i,1]),10); end; SetCursorPos(x,y);
AssignFile(Exportfile,'D:\_Delphi5\Statistiken\report.txt'); rewrite(Exportfile); end; |
bummi - Do 17.11.11 14:16
Ich habe leider gerade keine Zeit, aber ein TdxDBGrid ist kein Stringgrid .....
Delete - Do 17.11.11 14:16
Ich werde aus deinem Quelltext nicht so ganz schlau. Du suchst dir ein Fenster X mit FindWindow. OK. Dann verschiebst du es an eine feste Position. Warum auch immer, aber OK. Dann klickst du in das Fenster rein. Warum auch immer, aber OK. Und dann kopierst du den Fenstertitel des Fensters X in Zellen deines Stringrinds. Im Stringgrid hast du dann alo 17 mal den Fenstertitel von Fenster X stehen. In deinem Fall also 17 mal das Wort "Statistik". Was soll das?
eventuell Hilft es die Hilfe zu GetWindowText zu lesen:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633520%28v=vs.85%29.aspx Insbesondere:
Zitat: |
However, GetWindowText cannot retrieve the text of a control in another application. |
Was willst du denn eigentlich machen?
Rupert - Do 17.11.11 15:20
Danke - GetWindowText cannot retrieve the text of a control in another application
Ich dachte, dass ich die Inhalte der Tabelle mit Getwindowstext erhalte - falsch :(
Ich will die Tabelleninhalte auslesen.
Delete - Do 17.11.11 16:09
Dann musst du es aber erst mal finden. Mit FindWindow, bekommt man nur das Handle eines Toplevel-Fensters und nicht von Child-Fenstern. Steht auch in der Hilfe. Die Frage ist nur, ob die Komponente überhaupt ein handle hat. Es scheint ja eine Delphi-Komponente zu sein, ein Stringgrid und ob das ein Handle hat, weiß ich nicht. Es kann auch so sein wie beim Label, welches auch kein Handle hat. stellt sich zusätzlich die Frage, wie man an die einzelnen Zellen kommt.
Rupert - Do 17.11.11 16:33
Mit Strg+C kann ich die Werte jedenfalls nicht herauskopieren.
Xion - Fr 18.11.11 09:31
http://www.delphi-library.de/viewtopic.php?t=97738
In Kapitel 3 (3.SourceCode-Block) lese ich aus einem Memo mit WM_GETTEXT und FindWindowEx. Das brauchst du auch. Was du bei WM_GETTEXT bekommst musst du mal ausprobieren. Wenn du Glück hast, dann den Zelleninhalt ;)
Rupert - Do 24.11.11 19:03
Ich habe nun intensiv getestet - leider kein poitives Ergebnis.
Das Fenster
Delphi-Quelltext
1:
| hFenster :=FindWindowEX(hFenster,0,'TfrmStatistics',NIL); |
liefert mir keine Textinformationen. In der Anwendung - ich habe es schon zuvor gepostet - ist der rechte Mausclick umgeleitet und auch Strg-C ist wirkungslos.
Das dürfte möglicherweise der Grund für die leeren Strings bei der Botschaft WM_GETTEXT sein.
Interessant ist, dass es dieses Thema mehrmals im WEB zu finden gibt, aber nirgends eine Lösung gefunden wurde - vielleicht gibt es auch gar keine, das würde aber eine wahnsinns Arbeit für mich bedeuten.
Zur Zeit versuchen wir mittels IBM Rational Functional Tester die Geheimnisse der Tabelle zu lüften - es kann doch nicht sein, dass man etwas, was am Bildschirm sichtbar ist, nicht auslesen kann.....
Ich bleib d'ran :)
Xion - Do 24.11.11 20:49
Rupert hat folgendes geschrieben : |
Das Fenster
Delphi-Quelltext 1:
| hFenster :=FindWindowEX(hFenster,0,'TfrmStatistics',NIL); |
liefert mir keine Textinformationen. In der Anwendung - ich habe es schon zuvor gepostet - ist der rechte Mausclick umgeleitet und auch Strg-C ist wirkungslos.
Das dürfte möglicherweise der Grund für die leeren Strings bei der Botschaft WM_GETTEXT sein. |
D.h. du wolltest mal den Fenstertitel auslesen?
Quick & Dirty:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var h: THandle; S: String; TextLength: DWord; begin h:=FindWindow(nil,'TfrmStatistics');
TextLength := SendMessage(H, WM_GETTEXTLENGTH, 0, 0) ; SetLength(S,TextLength+1); SendMessage(H,WM_GETTEXT,TextLength+1,Integer(Pointer(S)));
ShowMessage(S); end; |
Rupert hat folgendes geschrieben : |
Zur Zeit versuchen wir mittels IBM Rational Functional Tester die Geheimnisse der Tabelle zu lüften - es kann doch nicht sein, dass man etwas, was am Bildschirm sichtbar ist, nicht auslesen kann..... |
Natürlich kann das sein, Labels kann man auch nicht auslesen (zumindest nicht über ein Handle).
Was mich etwas wundert ist, dass ich garkein Handle zu dem StringGrid/DBGrid kriege...obwohl der Winspector mir eins sagen kann.
Delphi-Quelltext
1:
| h := FindWindowEx(h, 0, 'TdxDBGrid' , nil); |
Auch über die "Suche" kriege ich bei mir immer 0 (außer wenn ich z.B. ein Memo mit platziere, das findet er problemlos).
Delphi-Quelltext
1:
| h := FindWindowEx(h, 0, nil , nil); |
PS: Hab eben noch EnumChildWindows gefunden. Habs auf die Schnelle aber nicht zum arbeiten gebracht :| Vielleicht kommst du damit an das Handle.
http://www.swissdelphicenter.ch/de/showcode.php?id=727
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!