Fensterinhalt aus externem Programm auslesen

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Fensterinhalt aus externem Programm auslesen

    Hallo Leute,

    ich wollte einen bestimmten Text in einem externen Fensterinhalt überprüfen.
    Weiß aber nicht wie!
    Mal kurz zur Ausgangssituation:

    Ich habe ein Programm, in dem verschiedene Daten in Tabellenform hinterlegt sind. Ich müsste nun eine Möglichkeit finden, diese Daten auf bestimmte Werte zu prüfen. Genauer gesagt es soll beim Klick auf einen Datensatz in der Tabelle geprüft werden ob ein bestimmter Name hinterlegt ist. Dann soll eine entsprechende Warnung ausgegeben werden.prüfen.Es gibt leider keine Schnittstelle zu diesem Programm. Sodass es nur die Möglichkeit gäbe das über diesen Weg einzutüten...glaube ich zumindest.
    Ich habe breits mehrer Stunden versucht das Thema zu googeln, aber ohne Erfolg.

    Hat jemand von euch vlt. eine Idee wie man so etwas realisieren könnte?

    Vielen dank schon mal ;)!

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

    Das Problem ist das der Text(im externen Programm) beim klick nicht in die Zwischenablage kopiert wird.

    Der Text im Programm wird angeklickt, und automatisch wird die komplette Zeile markiert.
    Ich weiß ja nicht ob es überhaupt möglich ist den Text beim klick irgendwie auszulesen?
    Nach Möglichkeit soll eine Warnung bei klick in der jeweiligen Zeile erfolgen.
    das kommt ganz darauf an, wenn die Controls deiner Anwendung einen eindeutigen Namen haben ist es mit diesem wohl am einfachsten, aber du kannst auch nach dem Typ der Controls gehen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Process.GetProcessesByName->somit weißt du ob ein Prozess läuft, dieser hat ein Handle, aus diesem Handle kannst du auf Fenster schließen(WinAPI EnumChildWindows) und durch das Handle dieser Fenster wiederum auf entsprechende unter Controls(WinAPI FindWindowEx)...
    aber weiteres kann ich dir mit so wenig Informationen leider nicht sagen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hi das war ein super Tipp.

    Also das Programm ist folgendermaßen aufgebaut(laut Spy++):



    Quellcode

    1. {
    2. HWND wnd;
    3. wnd = FindWindow("TFormMain", "Callticket Version 3.1.1.7 : 0");
    4. wnd = FindWindowEx(wnd, 0, "TPanel", NULL);
    5. wnd = FindWindowEx(wnd, 0, "TPageControl", NULL);
    6. if (wnd != 0)
    7. {
    8. };
    9. };


    Ich hatte mir auch mal bei msdn, die Hardware Klassen zum auslesen des Speichers angeschaut,
    aber da gibt es ja soviele Memory Klassen...
    (msdn.microsoft.com/en-us/libra…ntroller_and_port_classes)

    Wenn ich den Speicher auslesen will dann brauche ich doch die genauen Adressdaten im Speicher, oder?
    nicht unbedingt, es geht auch durch das Handle mit WinAPI...den Quellcode kannst du ganz einfach übersetzen, brauchst einfach nur noch die WinAPI Deklerationen...
    der Link hat so wie es für mich aussieht nichts zu tun...
    guck dir dazu mal am besten das hier an...
    [VB 2008] Skype-Nachricht senden
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Habe des mal für mich angepasst.

    VB.NET-Quellcode

    1. Public Class Form1Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    2. 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
    3. Private hwnd As IntPtr
    4. Private f As IntPtrPrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. hwnd = System.Diagnostics.Process.GetProcessesByName("Callticket Version 3.1.1.7 : 0")(0).MainWindowHandle
    6. f = FindWindowEx(hwnd, 0, "TFormMain", "Callticket Version 3.1.1.7 : 0")
    7. f = FindWindowEx(f, 0, "TPanel", vbNullString)
    8. f = FindWindowEx(f, 0, "TPageControl", vbNullString)
    9. End Sub
    10. End Class


    Aber ich bekommen immer System.IndexOutOfRangeException, mit dem Fehler das die Spaltennamen nicht korrekt sind, sowie das der Index keine negative Zahl sein darf.
    und wie sieht der Code aus, für welches Programm und welches Control, ein entsprechender Screenshot von Spy++ wäre wahrscheinlich nicht schlecht...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    VB.NET-Quellcode

    1. hwnd = System.Diagnostics.Process.GetProcessesByName("Callticket Version 3.1.1.7 : 0")(0).MainWindowHandle

    "Callticket Version 3.1.1.7 : 0" das ist nicht der Prozessname, sondern eher der Fenstertitel, guck dir den Prozessname im Taskmanager bei Prozesse an...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    evtl. groß-und Kleinschreibung? oder fehlt die Endung ".exe" ? ansonsten durchläufst du die Liste aller Processe mal und lässt diese dir ausgeben, dann findest du auch den richtigen Prozessnamen
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Also ich habe das testweise mal mit ner Anwendung (MsWord)getestet, die alle haben (mehr o. weniger :).
    Aber ich erhalte den selben Fehler.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. hwnd = System.Diagnostics.Process.GetProcessesByName("WINWORD.EXE")(0).MainWindowHandle
    3. f = FindWindow("OpusApp", "Dokument1 - Microsoft Word")
    4. f = FindWindowEx(hwnd, 0, "_WwF", vbNullString)
    5. f = FindWindowEx(f, 0, "_WwB", "Dokument1")
    6. f = FindWindowEx(f, 0, "_WwG", "Microsoft Word-Dokument")
    7. End Sub


    Ich galube "er" hat irgendwie ein Problem mit der Null.
    Laut msdn Hilfe darf der Indexwert keine negative Zahl sein

    Aber das verstehe ich trotzdem irgendwie net...

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

    Fehler wurde behoben.

    Habe jetzt mal ein Test Programm erstellt, indem einfach nur ein DataGridView mit ein Paar Daten hinterlegt ist.
    Jetzt möchte ich die Daten mit meinem Programm auslesen.

    VB.NET-Quellcode

    1. Dim PID As Integer = 0
    2. Me.txtPID.Text = Nothing
    3. Me.txtPname.Text = Nothing
    4. For Each P As Process In System.Diagnostics.Process.GetProcessesByName("GridTest")
    5. If LCase(P.ProcessName.ToString) = "gridtest" Then
    6. PID = P.Id.ToString
    7. Me.txtPID.Text = PID
    8. Me.txtPname.Text = P.ProcessName.ToString
    9. End If
    10. Next
    11. If PID > 0 Then
    12. hwnd = System.Diagnostics.Process.GetProcessById(PID).MainWindowHandle
    13. f = FindWindow("WindowsForms10.Window.8.app.0.378734a", "Form1")
    14. f = FindWindowEx(hwnd, 0, "WindowsForms10.Window.8.app.0.378734a", vbNullString)
    15. Else
    16. MsgBox("Anwendung nicht gestartet!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Fehler")
    17. End If



    Aber wie komme ich jetzt an die Daten in dem DataGridView?
    Nochmal zu Erinnerung. Beim klick in eine Zeile wird die komplette Zeile markiert. Wie kann ich diese markierte Zeile auf bestimmte Datensätze überprüfen?

    VB.NET-Quellcode

    1. hwnd = System.Diagnostics.Process.GetProcessById(PID).MainWindowHandle
    2. f = FindWindow("WindowsForms10.Window.8.app.0.378734a", "Form1")
    3. f = FindWindowEx(hwnd, 0, "WindowsForms10.Window.8.app.0.378734a", vbNullString)

    das sieht mir auch nicht wirklich richtig aus...
    also die erste Zeile gibt dir das Hauptfenster aus, die Zweite wird schätze ich nicht funktionieren...und die dritte verwendet wiederum das Handle aus der ersten...wenn du die Form mit dem Namen Form1 benötigst, dann lass alles andere mal weg :P
    (jetzt brauchste das auslesen des Prozesses gar nicht mehr)

    VB.NET-Quellcode

    1. f = FindWindow(vbNullString, "Form1")
    2. f = FindWindowEx(f, 0, "WindowsForms10.Window.8.app.0.378734a", vbNullString)

    "WindowsForms10.Window.8.app.0.378734a" -> Sicher, dass dies der Typ des Untercontrols ist?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ja habe das nochmal überprüft, mein DataGrid heißt laut Spy++:
    "WindowsForms10.Window.8.app.0.378734a", "Form1"
    Es erscheint kein Fehler und funktioniert ja auch.

    Aber wie komme ich denn jetzt an die Daten im Grid?
    Hast du ne Idee?