AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Inhalt eines Editfelds einer Fremdanwendung auslesen? Wie?
Thema durchsuchen
Ansicht
Themen-Optionen

Inhalt eines Editfelds einer Fremdanwendung auslesen? Wie?

Ein Thema von niemandsland · begonnen am 29. Jul 2004 · letzter Beitrag vom 3. Dez 2004
Antwort Antwort
Seite 1 von 2  1 2      
niemandsland

Registriert seit: 29. Jul 2004
5 Beiträge
 
Delphi 6 Personal
 
#1

Inhalt eines Editfelds einer Fremdanwendung auslesen? Wie?

  Alt 29. Jul 2004, 05:56
Morgen,

ich hab da ein Problem:
ich möchte gern den Inhalt aus einem Edit (Textfeld) einer Fremdanwendung holen und es unter bestimmten Umständen auch schreiben. Um mal warm zu werden hab ich mich an einem Beispiel, den Windows Taschenrechner ("calc.exe") versucht. Das klappt ganz gut. Leider komme ich damit bei meinem Programm nicht weiter. Jetzt wollte ich mich an mein eigentliches Programm machen. Doch da fehlt mir die zündende Idee.

Vielleicht kann mir ja hier jemand helfen.

Zuerst mal ein Source

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    myMemo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

const
  WinName = 'Pauls Commander';
  WinClass = NIL;

implementation

{$R *.dfm}

function EnumProc(StHandle: HWND; lines: TStrings): boolean; stdcall;
var
  buffer, desc: array [0..100] of char; // max. 101 Zeichen
begin
  GetClassname(StHandle, buffer, 100); // 100
  GetWindowText(StHandle, desc, 100); // 100
  lines.add(format('ID: %d, Class: %s, Text: %s',[GetDlgCtrlID(StHandle), buffer, desc]));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hwnd:dword;
begin
  myMemo1.clear;
  hwnd := FindWindow(WinClass, WinName);
  if (hwnd = 0) then
  begin
    messagebox(0,'Programm nicht im Speicher!','Warning!',0);
    exit;
  end;
  EnumChildWindows(hwnd,@EnumProc,Integer(myMemo1.Lines));
// Handle, Functioncall, <return result>
end;
Das Beispiel funktionierte beim Windowstaschenrechner (CALC) noch ganz gut. Bei meinem zweiten Programm komme ich aber irgendwie nicht wirklich an mein Textfeld {EDIT}. Und schon gar nicht an den Inhalt dieses Feldes. Kann mir da mal jemand helfen? Ich hab zwar die einzelnen Childwindows soweit aufgelistet... Auch die drei Textfelder sind mit ID enthalten; Allerdings fehlt der Inhalt des Textfeldes.

Wäre für jede Hilfe dankbar!

Achja, nur mal so eine IDee...

Kommt man am Ende einfacher ans Ziel, wenn man sich in das Programm per Hook einklinkt? Wie mach ich das am gescheitesten? Wenn ich jetzt keinen Denkfehler habe, dann läuft die Aktion doch fast auf die gleiche Geschichte hinaus, right?

>Besten Dank im voraus für Eure Mühe!

-NimalA-
ALT + CTRL + ENTF
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Inhalt eines Editfelds einer Fremdanwendung auslesen? Wi

  Alt 29. Jul 2004, 05:59
Also wenn du die ID schon hast, dann versuch mal MSDN-Library durchsuchenGetDlgItemText.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Reddog
Reddog

Registriert seit: 18. Jul 2004
Ort: Würzburg
56 Beiträge
 
#3

Re: Inhalt eines Editfelds einer Fremdanwendung auslesen? Wi

  Alt 29. Jul 2004, 08:22
Oder mit:
Delphi-Quellcode:
 
...

var
  Text: string;
  count: integer;

begin
  count:= 256;
  SetLength(Text, 256);
  count:= SendMessage(Handle, WM_GETTEXT, count, integer(PChar(Text)));
  SetLength(Text, count);

...
Sollte so gehen. HabS' jetzt nicht getestet, aber vor kurzer Zeit hab ich auch so ein Prog geschrieben.

Reddog.
All prime numbers are odd with the exception of two, which is an odd prime
  Mit Zitat antworten Zitat
niemandsland

Registriert seit: 29. Jul 2004
5 Beiträge
 
Delphi 6 Personal
 
#4

Re: Inhalt eines Editfelds einer Fremdanwendung auslesen? Wi

  Alt 30. Jul 2004, 00:29
@ Luckie

Danke für Deine schnelle Antwort heute morgen. Ich hab mir auch gleich die Doku -hier- durchgelesen. Und daraufhin die Zeile die ich ins Memo schreibe ein wenig umgestellt! Eigentlich wollte ich den Inhalt sämtlicher Textfelder mal eben mitauslesen... aber irgendwie war das ein Satz mit X.

Ich bin entweder noch nicht wach (bin ich nie!), oder zu blöd -- da blond!

Ich hab da jetzt ein Problem:
lines.add(format('ID: %d, class: %s, caption: %s, text: %s',[GetDlgCtrlID(AHandle), buf, Caption,(GetDlgItemText(AHandle,(GetDlgCtrlID(AHandle)),pop,256))])); Achja, pop ist 'nen 256er "array of char"!

Kann mir da vielleicht mal eben jemand auf die Sprünge helfen?

@ Reddog

Danke für die Antwort. Hast Du vielleicht auch eben mal die Syntax für WM_SENDTEXT zur Hand?

Ich werde mich dann damit noch ein wenig vergnügen!

@ ALL

Mal eben eine Frage... mir fällt dazu gerade nichts gescheites ein...

Ich habe in dem Programm (auf das ich zugreifen möchte) 7 oder 8 Textfelder {EDIT} gefunden. Die Inhalte sind recht ähnlich. Wie kann ich da sinnvoll das richtige rausfinden?! Hab schon ein wenig versucht. War aber immer mal das falsche dabei.

Es geht in allen Feldern um Koordinateninfos und Bezugspunkte. Aus diesem Grund will mir auch noch nicht so wirklich was gescheites einfallen.

Hat da jemand was dazu?

-NimalA-
ALT + CTRL + ENTF
  Mit Zitat antworten Zitat
niemandsland

Registriert seit: 29. Jul 2004
5 Beiträge
 
Delphi 6 Personal
 
#5

Re: Inhalt eines Editfelds einer Fremdanwendung auslesen? Wi

  Alt 30. Jul 2004, 08:29
@ ALLE DIE GEANTWORTET HABEN!

Danke. Habs in der vergangenen Nacht soweit gelöst. Hatte wohl wirklich 'nen Aussetzer!

Mein einzigsten -Problem- ist jetzt noch, wie simuliere ich das Drücken der Return-Taste bzw. des Mausbutton in der fremden Anwendung? Insbesondere innerhalb eines Edit-Felds?

Besten Dank im voraus für Eure Mühe!

-NimalA-
ALT + CTRL + ENTF
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Inhalt eines Editfelds einer Fremdanwendung auslesen? Wi

  Alt 30. Jul 2004, 08:33
wenn das Fenster wo der klick erfolgen soll sichtbar ist geht es mit.
Delphi-Quellcode:
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUp, x, y, 0, 0);
Anstelle von x und y die Coordinate eintragen wo der Button relativ zum screen liegt. Ansonsten musst du mit Sendmessage ne Nachricht an den Button schicken
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Inhalt eines Editfelds einer Fremdanwendung auslesen? Wi

  Alt 30. Jul 2004, 12:05
Das mit den Koordinaten ist nicht so gut. Hardcoden geht nicht und vorher immer ermitteln ist auch blöd. Wenn du das Handle des Buttons hast, sende ein MSDN-Library durchsuchenBM_CLICK oder ein MSDN-Library durchsuchenBN_CLICK (das verwechsele ich immer ) an den Button.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
niemandsland

Registriert seit: 29. Jul 2004
5 Beiträge
 
Delphi 6 Personal
 
#8

Re: Inhalt eines Editfelds einer Fremdanwendung auslesen? Wi

  Alt 30. Jul 2004, 12:32
@ Luckie

Nochmals Danke! Bleibt nur noch ein Punkt übrig:

Mein einzigsten -Problem- ist jetzt noch, wie simuliere ich das drücken der Return-Taste innerhalb des Edit-Felds (ebenfalls in der fremden Anwendung?)

-NimalA-
ALT + CTRL + ENTF
  Mit Zitat antworten Zitat
Benutzerbild von Reddog
Reddog

Registriert seit: 18. Jul 2004
Ort: Würzburg
56 Beiträge
 
#9

Re: Inhalt eines Editfelds einer Fremdanwendung auslesen? Wi

  Alt 1. Aug 2004, 00:47
Ich würde direkt an das Edit-Feld die Messages WM_KEYDOWN + WM_KEYUP senden mit VK_RETURN als wParam. Bei WM_KEYUP muss man noch aufpassen, welche Flags bei lParam gesetzt werden müssen. Soweit ich mich erinnere habe ich immer lParam = 1 or (3 shl 29) gesetzt. Ob das jetzt auch richtig ist, kann ich nicht mit Sicherheit sagen.

Ich gehe auch davon aus, dass du das Handle des EDITs hast.

Reddog.
All prime numbers are odd with the exception of two, which is an odd prime
  Mit Zitat antworten Zitat
niemandsland

Registriert seit: 29. Jul 2004
5 Beiträge
 
Delphi 6 Personal
 
#10

Re: Inhalt eines Editfelds einer Fremdanwendung auslesen? Wi

  Alt 1. Aug 2004, 01:25
Zitat von Reddog:
Ich würde direkt an das Edit-Feld die Messages WM_KEYDOWN + WM_KEYUP senden mit VK_RETURN als wParam. (...)

Ich gehe auch davon aus, dass du das Handle des EDITs hast.
Erstmal Danke für die Antwort!

Ja, klar Handle hab ich. Aber ich kann mir gerade auf Deinen Vorschlag oben keinen Reim machen...
Du meinst etwa:
Delphi-Quellcode:
SendMessageA(<hanlde>, WM_KEYDOWN, VK_RETURN, 0);
SendMessageA(<hanlde>, WM_KEYUP, VK_RETURN, (1or(3shl29)));
Falls ich da jetzt um 1 Uhr in der Nacht nicht ganz folgen kann, so bitte ich mal um ein CodeSchnipsel der die entsprechende Passage enthält! Das wäre jedenfalls super!

Danke!

-NimalA-
ALT + CTRL + ENTF
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 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