Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   EnumProc - EditFeld in externer Software suchen (https://www.delphipraxis.net/197517-enumproc-editfeld-externer-software-suchen.html)

Graw 13. Aug 2018 09:06

EnumProc - EditFeld in externer Software suchen
 
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.

KodeZwerg 13. Aug 2018 09:54

AW: EnumProc - EditFeld in externer Software suchen
 
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.

Graw 13. Aug 2018 09:59

AW: EnumProc - EditFeld in externer Software suchen
 
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');

KodeZwerg 13. Aug 2018 10:12

AW: EnumProc - EditFeld in externer Software suchen
 
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);

API 13. Aug 2018 10:14

AW: EnumProc - EditFeld in externer Software suchen
 
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.

KodeZwerg 13. Aug 2018 11:05

AW: EnumProc - EditFeld in externer Software suchen
 
Liste der Anhänge anzeigen (Anzahl: 2)
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: Anhang 49709
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: Anhang 49710
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;

himitsu 13. Aug 2018 13:32

AW: EnumProc - EditFeld in externer Software suchen
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 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