AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein EnumProc - EditFeld in externer Software suchen
Thema durchsuchen
Ansicht
Themen-Optionen

EnumProc - EditFeld in externer Software suchen

Ein Thema von Graw · begonnen am 13. Aug 2018 · letzter Beitrag vom 13. Aug 2018
Antwort Antwort
Graw

Registriert seit: 26. Apr 2017
77 Beiträge
 
Delphi 11 Alexandria
 
#1

EnumProc - EditFeld in externer Software suchen

  Alt 13. Aug 2018, 09:06
Hallo,

ich benötige noch einmal eure Hilfe.

Ich habe eine Software die in eine im Hintergrund laufende Software etwas in ein Edit Feld eintragen soll.

Die Funktion ist gegeben, das Problem ist nur das sich ein Name eines Windows immer beim Neustart der Software einen neuen Namen erhält.

Hier mein aktueller Code mit dem ich das Edit finde:

Code:
 
  h:=FindWindow('SAP_FRONTEND_SESSION','SAP 123');

    if IsWindow(h) then
    begin

      h:=FindWindowEx(h, 0, 'Afx:6FE0000', nil);
      if IsWindow(h) then
      begin
        if IsWindow(h) then
        begin
          h:=FindWindowEx(h, 0, 'ComboBox', nil);
          if IsWindow(h) then
          begin
          if IsWindow(h) then
          begin
            h:=FindWindowEx(h, 0, 'Edit', nil);
            if IsWindow(h) then
            begin

Das Problem ist das sich 'Afx:6FE0000' immer neu benennt.
Wie kann ich nun nach dem Edit suchen?
Ich denke das ich da mit EnumWindowsProc arbeiten kann, stehe hier aber auf dem Schlauch.

Vielen Dank.

Geändert von Graw (13. Aug 2018 um 10:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: EnumProc - EditFeld in externer Software suchen

  Alt 13. Aug 2018, 09:54
Du musst Dir zuerst das Handle vom Control besorgen wo Du drauf zugreifen willst. Das geht per Resource Editor oder WindowSpy Tool am einfachsten.

Suche mal hier im Forum nach Hier im Forum suchenfernsteuern, da findest Du bestimmt fertige Informationen dazu.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Graw

Registriert seit: 26. Apr 2017
77 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: EnumProc - EditFeld in externer Software suchen

  Alt 13. Aug 2018, 09:59
Ich habe mir das alles mit WinSpy geholt.
Dann habe ich in meiner Software Afx:6FE0000, ComboBox und Edit fest eingetragen.
Funktioniert dann auch wunderbar.

Das Problem ist nur wenn die Software neu gestartet wird, bekommt Afx:6FE0000 einen leicht veränderten Namen zugewiesen.

den Handle der eigentliche Software bekomme ich ja schon mit:

h:=FindWindow('SAP_FRONTEND_SESSION','SAP 123');

Geändert von Graw (13. Aug 2018 um 10:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: EnumProc - EditFeld in externer Software suchen

  Alt 13. Aug 2018, 10:12
Ich mache es so:
Copy/Paste das wichtigste aus einem Tool von mir
Delphi-Quellcode:
man braucht ein paar variablen
wh = HWND = ist das haupthandle vom target prozess
targetclass und targetcaption = string = gefüllt mit sinnvollem text
TARGETEDCONTROL = (D)WORD = ist das window control handle vom target

  WH := 0; // inititalize this value to 0
  if Length(TARGETCLASS) > 0 then WH := FindWindow( TARGETCLASS, NIL ); // feature, search for targets window by CLASSNAME
  if ((WH = 0) and (Length(TARGETCAPTION) > 0)) then WH := FindWindow( NIL, TARGETCAPTION ); // feature, search for targets window by CAPTION (unsafe)
  if WH <> 0 then // if we find it, lets copy data into that form
  begin
    SendMessage(GetDlgItem(WH, TARGETEDCONTROL), WM_SETTEXT, 0, Integer(PChar('Foobar'))); // send text to target windows edit box
  end;
  FindClose(WH);
Gruß vom KodeZwerg

Geändert von KodeZwerg (13. Aug 2018 um 10:21 Uhr)
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#5

AW: EnumProc - EditFeld in externer Software suchen

  Alt 13. Aug 2018, 10:14
Da bietet sich Hier im Forum suchenEnumChildWindows / Bei Google suchenEnumChildWindows an.
Damit werden die untergeordneten Controls eines Fensters aufgelistet. In der Callback Funktion kann dann überprüft werden, ob der Klassenname z.B. mit 'Afx:' beginnt.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: EnumProc - EditFeld in externer Software suchen

  Alt 13. Aug 2018, 11:05
Hier ein Beispiel zu meinem genannten Source unter Verwendung des Tools "Spy Window"

Ziel: Daten ermitteln um in WindowsExplorer Fenster die Adress-Zeile manipulieren zu können.
Vorgehensweise: Explorer Fenster öffnen und WindowSpy starten.

Mit dem Sniper Icon auf die Fenster Caption drag/droppen nun sieht man die Daten aus diesem Bild: handle-vom-fenster-ermitteln.jpg
Was uns an diesem Hinweisen hilft sind "Caption" und "Class"
Also notieren wir uns diese und zwar so
TARGETCLASS = 'CabinetWClass';
TARGETCAPTION = 'Dieser PC';

Jetzt Snipern wir die Adress-Zeile und erhalten neue Daten, mit einem klick auf General kommt das zum Vorschein: id-vom-control-ermitteln.jpg
Was uns nun interessiert ist die Control ID.
Also notieren wir uns diese und zwar so:
TARGETEDCONTROL = $3E9;

Das ganze als Source zusammengepackt ergibt:

Delphi-Quellcode:
Procedure MachWas();
const
  TARGETCLASS = 'CabinetWClass';
  TARGETCAPTION = 'Dieser PC';
  TARGETEDCONTROL = $3E9;
  TARGETTEXT = 'Foobar'; // <- Das soll dann in Adresszeile stehen
var
  WH: HWND;
begin
  WH := 0;
  if Length(TARGETCLASS) > 0 then WH := FindWindow( TARGETCLASS, NIL );
  if ((WH = 0) and (Length(TARGETCAPTION) > 0)) then WH := FindWindow( NIL, TARGETCAPTION );
  if WH <> 0 then
  begin
    SendMessage(GetDlgItem(WH, TARGETEDCONTROL), WM_SETTEXT, 0, Integer(PChar(TARGETTEXT)));
  end;
  FindClose(WH);
end;
Gruß vom KodeZwerg

Geändert von KodeZwerg (13. Aug 2018 um 11:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#7

AW: EnumProc - EditFeld in externer Software suchen

  Alt 13. Aug 2018, 13:32
Im Titel steht auch schon eine Lösung.

Wenn sich der Name ständig ändert, dann einfach anders danach suchen.
Entweder über den ClassName anstatt den WindowTitle (Caption)
oder du kannst auch nach Teilnamen suchen, also in MSDN-Library durchsuchenEnumWindows/MSDN-Library durchsuchenEnumChildWindows manuell vergleichen und dir das merken, was mit "Afx:" anmfängt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:59 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