Announcement

Collapse
No announcement yet.

Grid von externer Anwendung auslesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Grid von externer Anwendung auslesen

    Hi,

    ich muss in einer externen Anwendung den inhalt der aktiven Zeile eines Grid's auslesen.
    Allerdings habe ich keine Ahnung wie ich an diese Daten kommen soll.

    Nach mehreren Stunden Googel habe ich folgendes gefunden.

    Code:
    Public Class Form1
    
        Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
        Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWndParent As Integer, ByVal hWndChildAfter As Integer, ByVal lpszClass As String, ByVal lpszWindow As String) As Integer
    
        Private hwnd As IntPtr
        Private f As IntPtr
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim PID As Integer = 0
    
            Me.txtPID.Text = Nothing
            Me.txtPname.Text = Nothing
    
            For Each P As Process In System.Diagnostics.Process.GetProcessesByName("GridTest")
                If LCase(P.ProcessName.ToString) = "gridtest" Then
                    PID = P.Id.ToString
                    Me.txtPID.Text = PID
                    Me.txtPname.Text = P.ProcessName.ToString
                End If
            Next
    
            If PID > 0 Then
    
                hwnd = System.Diagnostics.Process.GetProcessById(PID).MainWindowHandle
                f = FindWindow("WindowsForms10.Window.8.app.0.378734a", "Form1")
                f = FindWindowEx(hwnd, 0, "WindowsForms10.Window.8.app.0.378734a", vbNullString)
    
            Else
                MsgBox("Anwendung nicht gestartet!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Fehler")
            End If
    
        End Sub
    End Class
    Hier komme ich ja nur auf das Objekt und nicht auf die Daten die ich benötige.

    Gruß Patrick

  • #2
    Kurz gesagt: Geht nicht

    Man kann nicht einfach das Grid einer anderen Anwendung auslesen, da man von der anderen Anwendung ja gar nicht weiss wie sie intern läuft. Normalerweise ist eine andere Anwendung nur Maschinenencode. Dass Du über Windows API an die Fenster kommst liegt daran, dass Windows eben mit Fenstern arbeitet und diese kennt. Darin wird jedoch einfach nur gezeichnet.
    Es gibt auch nciht einfach ein Control was Du Dir rüberholen könntest... es gibt x unterschiedliche Oberflächenframeworks und x untschiedliche Programmiersprachen die jeweils unterschiedlichen Output erzeugen.

    Wie gesagt: Geht nicht

    Comment


    • #3
      Danke für die schnelle Antwort.

      Währe es gegebenen falls möglich über den Speicher an diese Informationen zu kommen. Hintergrund ist der das wir eine Software haben in der mehrere einträge stehen. Bei Selektion bestimmter Zeilen muss eine Warnung ausgegeben werde.
      Diese Funktion bietet diese Anwendung allerdings leider nicht und der Hersteller ändert diese Software auch nicht.

      Comment


      • #4
        Wie gesagt: Geht nicht
        Für den Spezialfall das man die entsprechende Anwendung genau kennt schon.
        Interessanter Beitrag mit Beispiel hier.
        Bedeutet aber nicht das das einfach wäre und die Lösung wird bei jedem Update der zu überwachenden Anwendung mehr oder weniger neu zu entwickeln sein.

        Bei Selektion bestimmter Zeilen muss eine Warnung ausgegeben werde.
        Ist die zu überwachende Anwendung eine .Net Anwendung und nicht obfuscated?

        Comment


        • #5
          Über diese Anwendung habe ich in sachen Quellcode leider keine Information.
          Das behält Siemens leider für sich.

          Comment


          • #6
            Der Name des Fenster lautet 'WindowsForms10.Window.8.app.0.378734a' das weist ja mal stark auf eine .Net Anwendung hin. Und wenn in den Prerequisites der Anwendung was steht von .Net Framework xy installieren kann man davon ausgehen das das auch ein .Net Anwendung ist. Zumindest die Prerequisites wird Siemens ja verraten haben.

            Du solltest dir die Anwendung mal im Reflector ansehen. Dort findest du dann auch raus was das für ein Control genau ist das du da auslesen möchtest vielleicht ergeben sich dann neue Möglichkeiten.

            Comment


            • #7
              Ich hab so die Befürchtung dass das nur eine Testanwendung ist, die er selber mit dem .NET Framework geschrieben.
              Wenn die Form in dem Programm Form1 und WindowsApp10 heisst, dann wünsch ich viel Spaß bei der Suche nach dem Rest

              Aber wenns natürlich .NET ist, kann man die Anwendung ja als Assembly einbinden und hat dann natürlich ganz andere Möglichkeiten ins Programm hinein zu langen. Eventuell kommt man dann sogar an die DALs heran und kann diese benutzen um die Daten auszulesen.

              Comment


              • #8
                Fanderlf hat recht, es handelt sich hierbei nur um eine Testanwendung.
                Die richtige kann ich mir an meinen Arbeitsplatz nicht installieren.
                Ich wollte erstmal testen ob es überhaupt möglich ist bevor ich mich an die anderen Rechner setze.

                Naja ich hab jetzt Feierabend, bis morgen

                Comment


                • #9
                  Aber es ist schon wichtig zu wissen auf welchem Framework die Anwendung läuft. Es gibt bestimmt auch in Java Mittel und Weg per Reflection was zu erreichen.
                  Aber ganz ohne Wissen über die Anwendung wirds wohl ziemlich schwer.

                  Comment

                  Working...
                  X