Daten aus externem Programm auslesen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von SystemUnknow.

    Daten aus externem Programm auslesen

    Hallo,

    ich kämpfe mich schon die ganze Zeit durchs Forum aber finde leider nichts passendes für mich.
    Ich schreibe ein Programm, dass Werte von einer Messmaschine in DGVs schreiben und anschließend in CSV-Dateien speichern soll.
    Zur Erklärung meines Problems:
    Ich muss es schaffen, dass wenn ich in meinem Programm auf Messung klicke, dass das an das andere Programm gesendet wird und die Messmaschine den O-Ring vermisst.
    Die Werte des O-Rings aus dem großen Gelben Feld sollen in der selben Prozedur an mein DGV übertragen werden.
    Bei dem Button Aktivieren soll die Messmaschine den Laser aktivieren.
    Ich hoffe es ist verständlich ausgedrückt.
    Bilder
    • mein_Program.jpg

      90,71 kB, 1.279×279, 391 mal angesehen
    • Messmaschine.jpg

      261,01 kB, 525×405, 419 mal angesehen

    xaverl schrieb:

    Ich muss es schaffen, dass wenn ich in meinem Programm auf Messung klicke, dass das an das andere Programm gesendet wird und die Messmaschine den O-Ring vermisst.

    Läuft denn Dein Programm auf dem gleichen PC wie das Messprogramm oder willst Du das über das Netzwerk steuern ? Ich gehe davon aus , dass das andere Programm kommerziell ist und keine Schnittstellen zur Steuerung zur Verfügung stellt ?

    Falls dem so ist wäre das Accessibility SDK oder der UI Automation Namespace evtl eine Möglichkeit. Allerdings sind diese meist ziemlich langsam, also nix Realtime.

    Andere Möglichkeit wäre über native Windows API's zu gehen.
    Ja die beiden Programme laufen auf dem selben Rechner.
    Es sollte aber eine relative schnelle Löschung (Verarbeitungszeit) sein, da es den ganzen Tag verwendet werden soll.

    Wie erfahre ich ob das Programm Schnittstellen zur Steuerung hat? Ich weiß das es in VB6 programmiert worden ist und das es über eine Serielle Schnittstelle mit der Messmaschine (Laser) komuniziert.

    Über dieses "native Windows API" hab ich jetzt schon jede Menge gehört hab aber noch nicht wirklich was Hilfreiches dazu gefunden um auch nur im entferntesten zu checken wie das genau funktioniert.
    Ich habe jetzt die Handles von dem Messprogramm ausgelesen, das ist z.B. $00000EF4.
    Desweiteren benutze ich den Quellcode von diesem Link den ich auf mich umschreiben möchte bzw. dabei bin.

    [VB.NET] [Tutor] API-Aufrufe in vb.net/2005/2008 + Kommunikation über Windows-Messages

    Jetzt hab ich aber noch ein Verständnisproblem mit den Handles wo ich die genau eingeben muss dafür gebe ich kurz ein beispiel an es wäre super wenn ihr mir erklären könntet wo ich da genau mein Handle eingeben muss.

    VB.NET-Quellcode

    1. '<<<Windowshandle suchen>>>
    2. Private Function AppPrevInstance() As IntPtr
    3. '// Windowhandle der anderen Anwendung holen
    4. Dim hwndOther As IntPtr = FindWindow(vbNullString, Me.Text)
    5. If hwndOther = Me.Handle Then
    6. Do Until hwndOther = CType(0, IntPtr)
    7. hwndOther = GetWindow(hwndOther, GW_HWNDNEXT)
    8. If WindowText(hwndOther) = Me.Text Then
    9. Return hwndOther
    10. End If
    11. Loop
    12. Else
    13. Return hwndOther
    14. End If
    15. Return CType(0, IntPtr)
    16. End Function


    Ich weiß, da er in diesem fall ein Window sucht das den selben namen hat wie seine eigenes, aber ich weiß nicht wo ich da mein Handle eingeben muss.

    Vielen Dank

    Edit: Ich würde das Me.Text durch "$00000EF4" ersetzen?

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

    Hallo,

    Die Buttons der fremden Anwendung kann ich jetzt ansteuern.
    Jetzt geht es mir darum die drei Messwerte aus dem anderen Programm zu holen.
    Diese drei Messwerte liegen in einem Frame.
    Mein momentaner Ansatz:

    VB.NET-Quellcode

    1. iHwndForm = FindWindow(vbNullString, "Migg")
    2. iHwndFrame = FindWindowEx(iHwndForm, 0, "ThunderRT6Frame", "Messungsergebnis")
    3. '// gibt den Text des Windows zurück
    4. Dim strBuffer As String
    5. Dim intLen As Integer
    6. intLen = GetWindowTextLength(hwnd) + 1
    7. strBuffer = Space$(intLen)
    8. GetWindowText(hwnd, strBuffer, intLen)
    9. strBuffer = Replace(strBuffer, Chr(0), "")
    10. SendMessage(iHwndFrame, ......)
    11. Return strBuffer


    leider weiß ich gerade trotz der msdn-Hilfe nicht wie ich die SendMessage zu befüllen habe, damit die Werte kopiert oder direkt in mein DGV eingetragen werden.

    Danke
    GetWindowText liest Fenstertitel aus aber nicht Text von irgend-welche controls, hier beschreibung zu Funktion:
    msdn.microsoft.com/en-us/library/ms633520%28v=vs.85%29.aspx

    Für Text auszulesen kanst du SendMessage oder PostMessage verwenden:
    msdn.microsoft.com/en-us/library/ms644950%28v=vs.85%29.aspx
    msdn.microsoft.com/en-us/library/ms644944%28v=vs.85%29.aspx

    Für Text auslesen verwende Win.Message WM_GETTEXT: msdn.microsoft.com/en-us/library/ms632627%28v=vs.85%29.aspx