Text und / oder Eigenschaften von Textfeldern, Buttons oder Optionsfeldern aus fremden Programmen auslesen

  • VB6

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Bluespide.

    Text und / oder Eigenschaften von Textfeldern, Buttons oder Optionsfeldern aus fremden Programmen auslesen

    Hallo Leute

    Ich Komme mit einem Thema, welches ich in den letzten 3-Monaten zu tausenden ergoogelt habe und viele Lösungen
    haben so wie beschrieben funktioniert.
    Auch mindestens 4 Musterprogramme, mit fertigem oder teilweise Code, konnte ich erfolgreich testen.

    Nur haben die ganzen 3-Monate und viele Nächte nicht zur Lösung meiner Anforderung geführt.

    Ich habe verschiedene Aufgaben zu erledigen, dabei muss ich Werte aus Testprogrammen oder Werte aus Maschinensteuerungen
    ablesen und auf einem Papierformular eintragen. Lesefehler, Schreibfehler und insgesamt ein langweiliger Job eben...

    Das möchte ich gerne automatisiert ablesen, insbesondere Messwerte die ich in einem Bereich von-bis überprüfen muss sind mühsam,
    da wäre es toll, den Messwert automatisch ablesen und prüfen zu können, da würde meinen Augen sehr gefallen.
    "Einfach" ein zusätzliches Programm starten, welches die Anzeige ausliest und mir mit einem grünen Haken anzeigt
    ob alles OK ist oder eben nicht.

    Alles Windows7 oder selten mal auch Windows10.
    Zur Programmierung steht mit nur VB6 zur Verfügung.


    Nun grüble ich, wie oben erwähnt, mindestens seit 3 Monaten daran rum und hab gefühlte 1000 Beiträge gelesen.
    Daraus lassen sich für Eure freundliche Hilfe, bereits einige Vermutungen ausschliessen:

    1. Die Programme haben keine API-Schnittstelle
    2. Ich weiss nicht womit die Fremdprogramme entwickelt und compiliert wurden
    3. Die meisten Beispiele die ich in VB zum laufen gebracht habe, konnten einwandfrei Textfelder, Buttons, Listen u.s.w. auslesen,
    von selbstgeschriebenen VB6 Programmen.
    4. Ich bekomme problemlos das Handle aller Fremdprogramme und damit z.B: den Fenstertitel
    5. Ich bekomme problemlos das Child-Handle von Buttons oder Textfeldern meines VB-Programmes und damit deren Name und Werte.
    6. Ich habe Winspy zuhilfe genommen, finde dort aber kaum brauchbare Informationen
    7. inspect.exe tut dasselbe und zeigt mir das was ich suche viel besser an.
    8. Ich habe gelesen und erkannt, dass es problematisch ist, wenn z.B: Textfelder einfach alle die Klasse "TextBox" haben
    so dass man diese dann halt alle durchsuchen muss um sich dann zu merken dass es das 3. Textfeld ist, deren Wert man benötigt.
    Irgendwie sollte man mit FindWindowEx aber auch den Namen / Titel eines Textfeldes erhaschen können, ist mir aber noch nicht gelungen
    9. Ich bin gefühlt auf der Suche nach einem "foreach" oder was in der Art, mit dem ich alle Elemente eines Fenster durchsuchen könnte.
    Dabei mach es auch keine Probleme wenn es mehrere "TextBox" Objekte gibt und falls diese die gleichen Namen haben u.s.w.
    Ich kann aufgrund der Werte in den Textboxen dann erkennen die "wievielte" es wäre und mein Programm daran ausrichten.

    Alles was ich in den letzten 3-Monaten als Beispiele oder Vorschläge und Codefragmente als "suchender" ohne in einem Forum explizit nachzufragen
    erhalten habe, hat grundsätzlich so funktioniert wie vorgeschlagen.

    Das besagte Programm aber, welches mir die Werte von einem angeschlossenen Gerät anzeigt, bringt mit FindWindow und FindWindowEx
    leider keine Textfelder u.s.w. zutage.
    Ich kann mi inspect.exe aber die Felder anschauen und konnte sogar mal mit inspect.exe einen Wert in diesem Fremdprogramm ändern.
    Es ist also Möglich die Werte auszulesen und zu ändern...
    Nur will mir das mit VB6 einfach nicht gelingen, auch wenn ich versuche mit den Classnamen diese Objekte zu finden.

    Hat hier jemand dazu eine Idee?
    Am liebsten wäre natürlich wenn ich einfach das HAndel des FEnsters habe und mit foreach (oder ähnlich)
    alle Objekte im Fenster auflisten könnte.

    Vielen Dank im Voraus Erwin
    OK, danke für den Tipp.
    Im Ramen meiner Recherchen habe ich schon früh etwas darüber gelesen,
    aber den Zusammenhang in den gefundenen Fragmenten leider nicht verstanden. ?(
    Der Link ist toll, da kann ich mich einlesen, das lohnt sich, da ich immer mal wieder was in der Richtung machen soll,
    da habe ich keine Hemmungen, ich gehöre nicht zu den "Programmierern" die hier drum bitten man solle ihnen
    gerne gratis eine schlüsselfertige Lösung entwickeln ;)

    Noch eine Frage habe ich dazu:
    Da steht: "Diese Dokumentation ist für .NET Framework-Entwickler vorgesehen"
    Ich habe sehr oft Codeschnipsel gefunden die auf .net basieren und auch nach stundenlangem suchen und ausprobieren
    ist mir nicht gelungen das in VB6 umzusetzen.
    Bestenfalls habe ich dann irgendwann gelesen dass es für VB6 kein Äquivalent gibt...

    Ich habe leider nur VB6.
    Zwar habe ich mal eine frei verfügbare Visual-Studio Version installiert, aber mein P7 mit 8GB RAM und SSD
    ist darob dermassen in die Knie gegangen, alleine das Starten des Programmes hat länger als 10 Minuten gedauert.
    Hätte auch kein Problem für eine Neue Entwicklungsgeneration etwas zu bezahlen...

    Aber:
    Als Microsoft im Jahr 2001 Visual Basic .NET auf den Markt brachte, stellte das Unternehmen die Weiterentwicklung von VB6 ein und veröffentlichte einige Dokumente zum Umstieg von VB6 auf VB.NET. Der Umstieg ist jedoch nicht gerade unproblematisch, denn es gibt zwar einige Statements, die ohne Probleme von VB.NET umgesetzt werden können, jedoch gibt es auch andere Statements, die komplett neu geschrieben werden müssen.
    Es gibt also durchaus einen Turnaround, wenngleich nicht unproblematisch,
    aber eben nach "oben" und nicht von .net nach VB6 :(

    Zudem bin ich mit VB6 so überglücklich, jedes kleine Hilfsprogramm, bis zur ausgereiften Applikation,
    alles was ich in den letzten 20 Jahren gebaut habe funktioniert einfach, auf jedem PC, von WXP bis W10.
    Ohne Installation, DLL, ohne OXC, ohne irgendwelche Updates von Librarys u.s.w. ohne "Windows-Updates" .....

    Ist es überhaupt realistisch dass ich mich dran mache diese UI eingehend zu studieren ohne .net ???
    Danke und Gruss Erwin
    Der Umstieg von VB6 zu VB.net ist gar nicht so schlimm. Da findest du dich schnell zurecht. Wenn du das Framework von .net nicht all zu hoch wählst, sagen wir mal maximal Version 4, dann solltest du auch unter den anderes System keine Laufzeitprobleme haben. Ok, XP weiß ich nicht genau aber ich glaube da dürfte im letzten ServicePack auch schon Version 4 drin gewesen sein. VB6 wird im Prinzip immer funktionieren aber für manche Dinge benötigst du .net einfach.

    MrBee schrieb:

    Zwar habe ich mal eine frei verfügbare Visual-Studio Version installiert, aber mein P7 mit 8GB RAM und SSD
    ist darob dermassen in die Knie gegangen
    Wenn du Visual Studio 2019 Community Edition installierst und alles abwählst, was für deine Zwecke nicht nötig ist, sollte das auch einigermaßen zügig starten.
    RAM und SSD sollte ausreichen, aus dem Prozessor wirst du halt keine Rakete mehr machen können.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo Zusammen

    2019 Comunity habe ich runtergeladen und installiert.
    Da gibt es nichts "abzuwählen".

    Aber einerlei, ich kann mit allen empfohlenen Tools, auch mit AHK keine Informationen über die Objekte
    wie Textfelder, Buttons u.s.w. aus den Programmen auslesen die ich steuern möchte.
    Ich bekomme das Handle des Fensters und den Fenstertitel und wenn es ganz gut läuft auch mal
    den Titel einer darunter liegenden (Ich glaube man nennt es Child), aber nützen tut mir das alles nichts.
    Da komm ich auch mit Visual Studio, egal welche Version nicht dran....

    Die Aussage: "Wenn Du das Handle hast kannst Du alles machen" stimmt schon, ich bekomme aber nur das Handle
    des Programmfensters und kein Handle der darunter liegenden Objekte...

    Was mich jedoch irritiert ist die Tatsache dass ich inspect.exe Werte in einem solchen externen Programm
    lesen und auch ändern konnte, obwohl diese gemäss inspect.exe-Ausgabe keinen Klassennamen haben.
    Hier kommt eine weitere Sache dazu die ich in den letzten 4-Monaten mal gelesen habe:
    Wenn es Objekte gibt die keinen oder den selben Namen haben, dann muss man einfach abzählen
    welches Objekt man lesen oder überschreiben will.
    Aber niemand erzählt etwas über eine "Foreach" oder ähnliches, womit ich das testen könnte.

    Ich kann auch mit dem Auge auslesen was in den Feldern steht, und programmtechnisch dann ermitteln
    welches Objekt es wäre, um es dann in meinem Programm zu fixieren.
    Aber eben, das alles funktioniert nur in der Theorie...

    Gibt es hier jemanden der sich damit besser auskennt, es auch mal versucht oder gelösst hat?

    Mit Mausklicks komm ich nur dort weiter wo man einen Wert doppelklicken und in dies Zwischenablage
    kopieren kann, das ist keine vernünftige Lösung, und funktioniert in den wenigsten Fällen.

    Vielen Dank im Voraus.
    @MrBee Falls ich Recht in der Annahme gehe, dass Du VB.NET programmierst, nicht aber VB6, dann ändere das Label im Header dieses Deines Threads.
    [Allgemein] VB.NET, VB6, VBA, VBS — Mit welcher Sprache programmiere ich eigentlich?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da ist jetzt im Ablauf etwas missverständlich geworden, sorry.
    Ich arbeite mit VB6
    Mir wurde hier VB.NET empfohlen, weil mein "Problem" fast ausnahmslos in der VB.NET Gemeinde besprochen wird
    und meine Bitte, mir hier in VB6 ein paar Tipps zu geben ausschliesslich in der Empfehlung endete ich soll VB.NET installieren.

    Das habe ich dann versucht und musste feststellen dass mein PC damit überfordert ist und so wurden paar Tipps
    bezüglich VB.NET ausgetauscht wie ältere Version, Teilinstallation u.s.w.
    Was aber an Ende der Analyse nicht mehr relevant ist, da ich wohl auch mit VB.NET nicht an die benötigten Werte gelangen kann.

    Also bleibt es bei VB6, mit dem ich auf die, einem Frame (Fremdprogramm) innewohnende Objekte zugreifen möchte, weil es
    soweit ich es in den ganzen Monaten der Analyse verstanden habe, nicht von der VB-Version abhängt, sondern von
    der dem Fremdprogramm zugrundeliegende Entwicklungsumgebung und Compiler.

    Ich werde nicht weiter versuchen eine funktionierende oder abgespreckte Version von VB.NET zu installieren
    weil ich gerade wegen der Unkompliziertheit von VB6 seit über 20 Jahren immer wieder kleine Programme entwerfe
    und damit sehr zufrieden bin. Sowie ich auch mit WIN7 sehr glücklich bin und mich diebisch darüber freue wenn Kollegen
    sich Nächtelang mit W10 und .NET herumschlagen müssen.

    Der langen Rede Kurzer Sinn: VB6 ist richtig
    Und ich wäre natürlich nach wie vor unglaublich glücklich, wenn jemand Ansätze dafür hätte wie ich mein Ziel erreichen kann,
    denn machar muss es sein, sonst könnte inspect.exe diese werte nicht sehen und auch verändern..
    Hallo Zusammen und vielen Dank für die Unterstützung.

    Leider wurde ich wohl missverstanden, ich erlebe oft in solchen Foren, dass meine Probleme nicht
    beachtet werden, sondern die aktiven Mitglieder lieber von sich erzählen, von dem was sie wissen
    und nicht wie zu erwarten wäre, ihr umfangreiches Wissen nutzen um neue Probleme mit wenig Aufwand
    zu erkennen und zu lösen oder zumindest Vorschläge in die vorhandenen Möglichkeiten anbieten.
    Ich weis nicht woher diese "Ich bin ein Experte weil ich weis wie es bei mir funktioniert" - Haltung herkommt,
    aber ich beobachte das seit rund 10-Jahren immer öfters.

    So etwa in der Art:
    Hey Leute ich liebe die Chips-Sorte XY aber bei uns im Laden gibts die nicht mehr, weis jemand wo man die noch bekommt?
    Und darauf Antworten:
    Ja ich mag die auch sehr, habe aber keine Ahnung wo man sie noch bekommt, aber die von ZZ sind auch sehr lecker.

    Nach inzwischen 4-Monaten Recherche und ich habe wirklich viel Zeit investiert,
    habe ich endlich eine fast unanständig einfache Methode gefunden.
    Sie nutzt hauseigene Mittel von VB6, kommt mit 2 Deklarationen aus und benötigt zur Findung des Inhaltes
    der von mir gewünschten Felder, Buttons u.s.w. grad mal 2 Zeilen Code.
    VB6 Spezialisten sind eine aussterbende, wenn nicht eine bereits ausgestorbene Spezies. Und sicher treiben sich auch nicht alle Spezialisten hier herum.
    Dein Wunsch oder besser deine Hoffnung ist verständlich, deine Erwartungshaltung hingegen nicht.
    Es ist doch nun einmal so, dass wer nicht mit der Zeit geht, mit der Zeit geht.

    MrBee schrieb:

    Nach inzwischen 4-Monaten Recherche und ich habe wirklich viel Zeit investiert,
    habe ich endlich eine fast unanständig einfache Methode gefunden.
    Sie nutzt hauseigene Mittel von VB6
    Ich freue mich für dich.

    Allerdings beklagst du dich einerseits, dass im Forum keine für dich adäquate Lösung zustande kam.
    Andererseits scheinst du aber auch nicht dazu beitragen zu wollen, das zu verbessern.

    Wenn du jetzt diese "unanständig einfache Methode" hier beschreibst, kann zumindest jeder der zukünftig auf dasselbe Problem stößt, die Lösung hier im Forum finden.

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Jo - siehs doch positiv: Es gibt Leute, die lesen sich deinen Post durch, und sagen, was sie wissen.
    Leider wissen sie es nicht - das kannst du aus den Antworten ja so ungefähr auslesen.
    Ich hätte auch antworten können - nämlich: "keine Ahnung, sorry" - das hab ich halt gelassen.

    Wäre das dir lieber gewesen, wenn deine Frage keine einzige Antwort bekommen hätte?



    Wiedemauchsei - nun hast du ja trotzdem eine Lösung.
    Und ich bin nichtmal sicher, ob ichs gut fände, wenn du uns daran teilhaben liessest.
    Weil das KnowHow zum "User-Input in anderen Programmen ausspionieren" - damit kann man auch ziemlich bösartige Malware bauen - imo muss das in einem Forum garnet unbedingt frei veröffentlicht werden.

    MrBee schrieb:

    ihr umfangreiches Wissen nutzen um neue Probleme mit wenig Aufwand
    zu erkennen und zu lösen oder zumindest Vorschläge in die vorhandenen Möglichkeiten anbieten.


    Wenig Aufwand? Wie meinst du das? Wer hat denn noch VB6? Selbst wenn ich dir jetzt helfen wollen würde, dann müsste ich mir ja erst mal VB6 wieder Einrichten und Installieren, damit ich da auch mal was ausprobieren kann und nützliches beitragen kann. Ich kopieren ja jetzt nicht irgendwas, dass ich direkt auf google finde. Aber leider hat Microsoft das nie gratis released. Die ganzen "Portable" Versionen, die so im Netz zu finde sind, sind alle illegal. Ich müsste mir das jetzt auf eBay für ca. 200€ oder mehr kaufen. Oder gibt es da eine Quelle die ich nicht kenne? Deine Frage geht also an eine User-Base die noch VB6 von früher installiert hat und immer noch damit unterwegs ist. Das sind wohl kaum noch welche.

    Ich freue mich für dich, dass es noch so gut bei dir funktioniert, also schmeiß das nicht weg. Mach eine Sicherung oder besser zwei. Aber VB6 ist praktisch nicht mehr zugänglich, also weiß ich nicht was du jetzt von den Usern hier erwartest.