Überprüfen ob Datei korrekt geöffnet wurde, danach anderes Programm steuern (SendKey)

  • VB.NET

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

    Überprüfen ob Datei korrekt geöffnet wurde, danach anderes Programm steuern (SendKey)

    Moinsen,
    ich bin es noch mal...

    Eines meiner ersten Programme läuft soweit bestens dank diesem Forum hier, um meinem Programm 2-3 Features zu verpassen würde ich folgendes gerne realisieren:

    Überprüfen ob eine bestimmte Datei fertig in ein (externes) Programm (Autodesk Inventor / 3D CAD Software) korrekt / vollständig geladen / geöffnet ist, wenn diese Bedingung erfüllt ist soll der Button Aktualisieren ausgeführt werden (externes Programm)... .

    Ich habe gelesen das man ein Button in einer "fremden" Software fernsteuern kann. Dazu benötigt man ein Programm das die Parameter des Buttons ausließt etc. da dieser Weg mir aber recht komplex erscheint, Denke ich das der Weg über "SendKey" der Sinnvollere ist, zumal es sich um ein kleines Feature handelt.


    Gelesen habe ich viel darüber jedoch konnte ich es nicht so recht nachvollziehen wie der Code aufgebaut werden muss, mal ist die user32.dll eingebunden mal nicht obwohl es sich nahezu um den selben Code handelt... ?(

    z.B. hier mit recht guter Doku:
    activevb.de/tutorials/tut_sendkeys/sendkeys.html

    Ein kurzer Stupser würde mir bestimmt schon das Licht einschalten (Ihr versteht schon was ich meine) :D


    Gruß Frosch
    Sendkeys ist ein denkbar schlechter Weg so etwas zu machen.

    Viele (alle?) Windowsprogramme bieten eine Schnittstelle zum Zugriff auf Programmfunktionen an, die COM (Component Object Model) heisst. Damit kannst du (fast) alle Funktionen deines CAD-Programms fernsteuern.

    Google mal nach Autodesk Inventor interop.dll

    Ich mache so etwas mit CATIA (ein anderes CAD Programm) und das klappt ziemlich gut - ist aber auch ne Menge Arbeit sich da einzulesen. Firmen dokumentieren nicht immer frei verfügbar wie man diese Schnittstelle genau nutzt, meist um eigene proprietäre, kostenpflichtige Schnittstellen nicht zu untergraben.

    Zum Thema starten und überprüfen eines externen Programms habe ich mir hier von den Boardprofis erklären lassen wie man es macht. Das sollte auf deine Fragestellung übertragbar sein.

    Ich bin derzeit sehr beschäftigt und kann mich nicht intensiver mit deiner Frage auseinander setzen, aber wenn du mal meine eigenen Threads durchsuchst (sind nicht so viele), kannst du sicher ein paar Anhaltspunkte finden die dir weiter helfen.

    Bei derartigen CAD/Programmierfragen ist ww3.cad.de eine exzellente Anlaufstelle. Hier ein Link zu NET Programmierung in Inventor.

    lg
    Definiere

    frosch2006 schrieb:

    korrekt / vollständig geladen / geöffnet
    Starte das Programm selbst über Process.Start, warte, bis es fertig geladen ist: WaitForInputIdle(...), dann kannst Du mit ihm über API-Funktionen und sein FensterHandle kommunizieren.
    Und
    @cl10k::
    Nur eine Minderheit von Programmen können über COM kommunizieren, nämlich die, die explizit dafür gemacht wurden.
    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!
    Also ich lasse eine Datei mit:


    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click Process.Start(exepfad & "/01_1.ipt") End Sub



    Öffnen wenn die Datei vollständig geladen ist (dauert bei Inventor ca. um die 1-2min, je nach PC Performance) soll mein "vb.net" Programm den "Aktualisieren" Button drücken.



    Falls möglich soll das Programm noch überprüfen ob sich ein neues Fenster öffnet falls ja soll er dieses bestätigen (wieder ein Button drücken)

    Gruß Frosch
    @Frosch2006:: Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Dim pr As New Process
    2. ' IF
    3. pr.StartInfo.FileName = exepfad & "/01_1.ipt"
    4. ' ELSE
    5. pr.StartInfo.FileName = exepfad
    6. pr.StartInfo.Arguments = "/01_1.ipt"
    7. 'ENDIF
    8. pr.Start()
    9. pr.WaitForInputIdle(2000) ' hier einen entsprechenden Wert (Millisekunden) eintragen
    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!

    frosch2006 schrieb:

    Folgende Fehlermeldung
    Poste mal deinen C&P-Code.
    Setz einen Haltepunkt drauf und überzeuge Dich, dass die richtigen Argumente in pr.StartInfo.FileName und pr.StartInfo.Arguments stehen.
    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!
    Kein wunder warum das nicht ging... -.- da wo ich es getestet habe gab es die "01_1.ipt" Datei nicht.

    Manchmal sieht man den Wald vor lauter Bäumen nicht mehr... . 8o



    Dennoch klappt es nicht so wie ich mir das vorgestellt habe, für was genau stehen diese Befehle?


    Quellcode

    1. pr.StartInfo.Arguments


    Quellcode

    1. pr.StartInfo.FileName



    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. Process.Start(exepfad & "/01_1.ipt")
    3. Dim pr As New Process
    4. pr.StartInfo.FileName = "01_1.ipt"
    5. pr.StartInfo.Arguments = exepfad & "/01_1.ipt"
    6. pr.Start(exepfad & "/01_1.ipt")
    7. pr.WaitForInputIdle(2000) ' hier einen entsprechenden Wert (Millisekunden) eintragen
    8. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „frosch2006“ ()

    Alle Ansätze die ich Probiert haben, führten nicht zu dem Ergebnis das ich erhofft habe.
    Nun habe ich ein anderen Lösungsansatz, ist es möglich Abzufragen ob ein bestimmter Prozess noch Daten in den Arbeitsspeicher lädt?

    Wenn ja wie gehe ich am besten vor dies abzufragen?

    VB.NET-Quellcode

    1. Dim NotepadMemory As Integer
    2. Dim component1() As Process
    3. component1(0).Start(exepfad & "/01_1.ipt")
    4. component1 = Process.GetProcessesByName("Inventor")
    5. NotepadMemory = component1(0).PrivateMemorySize
    6. If NotepadMemory > 300000 Then
    7. MsgBox("Datei fertig geladen", vbInformation + vbOKOnly, "Datei geladen!")
    8. Else
    9. MsgBox("Inventor nicht gestartet", vbCritical + vbOKOnly, "FEHLER!")
    10. End If



    Gruß Frosch

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „frosch2006“ ()

    frosch2006 schrieb:

    VB.NET-Quellcode

    1. Process.Start(exepfad & "/01_1.ipt")
    2. Dim pr As New Process
    3. pr.StartInfo.FileName = "01_1.ipt"
    Wer lesen kann, hat echt Vorteile.
    Sieh Dir noch mal ganz genau meinen Post #6 an.
    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!
    @frosch2006:: Dein Code:

    VB.NET-Quellcode

    1. Process.Start(exepfad & "/01_1.ipt")
    2. Dim pr As New Process
    3. pr.StartInfo.FileName = "01_1.ipt"
    --------
    Mein Code:

    VB.NET-Quellcode

    1. Dim pr As New Process
    2. ' IF ' <======= IF
    3. pr.StartInfo.FileName = exepfad & "/01_1.ipt"
    4. ' ELSE ' <======= ELSE
    5. pr.StartInfo.FileName = exepfad
    6. pr.StartInfo.Arguments = "/01_1.ipt"
    7. 'ENDIF
    8. pr.Start()
    9. pr.WaitForInputIdle(2000) ' hier einen entsprechenden Wert (Millisekunden) eintragen
    Du als Softwareabschreiber musst in meinem Code
    ENTWEDER
    den IF-Zweig
    ODER
    den ELSE-Zweig verwenden.
    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!