Hilfe beim Auslesen einer externen Listbox

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von Regular_vb_user.

    Hilfe beim Auslesen einer externen Listbox

    Hallo,

    ich bin schon länger auf der Suche wie ich folgendes umsetzen kann.
    Es gibt ein externen WindowHandle dessen Listbox ich gerne 1:1 auslesen würde. Ich habe es bereits direkt über CE versucht allerdings ohne Erfolg.
    Nachdem ich jedoch unzählig viele Threads durchstöbert habe und immer noch nicht weiß wie ich es anstellen kann, bitte ich um Hilfe.

    Die Listbox die ich auslesen möchte aktualisiert sich ständig und ist deshalb ziemlich überfüllt.
    Ich will eigentlich nur (für mich) eine einfachere Version dieser Listbox erstellen.
    Scheinbar soll es über EnumChildWindows oder FindWindowEx möglich sein die Listbox auszulesen, aber ich weiß nicht wie :/

    Gruß

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Regular_vb_user“ () aus folgendem Grund: Grammatik

    Regular_vb_user schrieb:

    EnumChildWindows oder FindWindowEx
    gugst Du hier: Andere Programme fernsteuern
    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!

    Regular_vb_user schrieb:

    keine Erfahrung in C#
    Das ist doch praktisch identisch mit VB.NET.
    Such Dir einen der vielen Online-Snippet-Konverter raus und übersetze die Snippets von C# nach VB.NET.
    Anders herum ist das nicht ganz so einfach, da Elemente einer Aufzählung in VB mit runden Klammern angegeben werden (arr(3)), in C# jedoch mit eckigen Klammern (arr[3]), wovon aber die Konverter nix wissen, da sie nicht Arrayelemente und Parameter einer Prozedur unterscheiden.
    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!
    Das stimmt schon, allerdings ist es für mich schwierig zu verstehen wie ich die einzelnen Codes in C# zusammenbauen müsste um dies dann in VBA anwenden zu können.
    Für mich ist es halt neu das es hier mehrere (ich nenne sie mal) "Programmcode-Bereiche" gibt, fast wie in C++ (ebenfalls 0 Ahnung).
    Form1.cs
    Program.cs
    Ich bin es von VB.NET halt gewohnt das es Standardmäßig nur 1 Programmcode-Bereich gibt.

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

    Wenn du VBA Code brauchst solltest du nicht mit VB.net und .net4.5 Flaggs arbeiten
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Regular_vb_user schrieb:

    in VBA
    Du willst von VBA aus auf ein externes Programm zugreifen?
    Im Titel Deines Theads steht VB.NET, FW4.5.
    Ja was denn nun?
    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!
    @Regular_vb_user Was ist denn das andere für ein Programm?
    C++, .NET Assembly, ...
    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!
    Ich weiß jetzt nicht worauf du hinaus willst.
    Was ich damit sagen wollte ist: Ich denke immer an Visual Basic Application. Das war jetzt eben ein Tippfehler und blöder Zufall das es eben genau diese alte Variante von Visual Basic als Bezeichnung gab.

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

    Regular_vb_user schrieb:

    worauf du hinaus willst.
    Wo kommt die externe ListBox her?
    Wo kommt das Windows-Handle her?
    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 es ist so das ich bei einem Spiel per Hotkey ein seperates Fenster öffnen kann. (Namen hab ich vorsichtshalber mal zensiert)
    In diesem Fenster existiert dann nur die Listbox.
    Allerdings gibt es 2 solcher Fenster die als "Error List" bezeichnet sind.
    ErrorWnd2 ist das was ich brauche.

    Hier nochmal Bilder von Spy++:

    Ich hoffe das ich dir damit deine Fragen beantworten konnte^^

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

    @Regular_vb_user Das ist doch bdereits die halbe Miete.
    Nun musst Du dich mal mit meinem Fernsteuer-Tut befassen und das auf dieses Fenster anwenden.
    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!
    @RodFromGermany Sry dass ich schon wieder nerve.
    Aber wie wende ich das hier an ?

    C#-Quellcode

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. Process[] prAll = Process.GetProcessesByName("FernsteuerungTestGui"); // hier ohne ".exe"
    4. this._Process = prAll[0];
    5. this._MainWnd = this._Process.MainWindowHandle;
    6. IntPtr btn = NativeMethods.FindWindowEx(this._MainWnd, IntPtr.Zero, "Button", "Button1");
    7. NativeMethods.SendMessage(btn, NativeMethods.WM_SETTEXT, IntPtr.Zero, "Button2");
    8. }

    Ich habe bei "WM_SETTEXT" eine Fehlermeldung und weiß nicht als was ich das definieren muss :(

    #Edit:
    habe es jetzt über

    C#-Quellcode

    1. ​public const int WM_SETTEXT = 0x000C;

    gelöst :)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Regular_vb_user“ ()

    Regular_vb_user schrieb:

    Aber wie wende ich das hier an ?
    Das ist eine etwas langwierige Sache.
    Du musst Dich an das Ziel-Control herantasten. Wenn Du die Fenster enumerierst, taucht Dein Zielfenster in der Reihenfolge stets an derselben Stelle auf. So bekommst Du das Handle Deines Zielfensters.
    Dann lies es aus.
    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!
    Ich hab es leider noch nicht geschafft die Listbox auszulesen.
    Allerdings habe ich eine Interessante Seite gefunden die vielleicht dem ein oder anderen weiterhilft (wie zb mir).

    Hier findet man die ganzen NativeMethods:
    referencesource.microsoft.com/…MS/Win32/NativeMethods.cs

    Ich habe es jetzt mal über .Net versucht.
    Beim klicken des Buttons bekomme ich eine Fehlermeldung.
    Jetzt weiß ich nicht ob ich den Code richtig angewendet habe oder nicht :/

    Hier der Fehler:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Regular_vb_user“ () aus folgendem Grund: Grammatik

    Regular_vb_user schrieb:

    Jetzt weiß ich nicht ob ich den Code richtig angewendet habe oder nicht
    Du hast die Prozedur falsch deklariert.
    Die richtigen Deklarationen findest Du hier: pinvoke.net/
    Ich nehme mal an, Du hast eine VB6-Deklaration verwendet.
    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!

    RodFromGermany schrieb:

    Du hast die Prozedur falsch deklariert.
    Die richtigen Deklarationen findest Du hier: pinvoke.net/

    Danke, ich hab die Fehler jetzt behoben.
    Beim Ausführen kommt jetzt kein Fehler mehr, allerdings auch keine Antwort.
    Ich habe jetzt nochmal bei den Basics angefangen, da ich vermute, dass ich irgendein Fehler im ChildHandle habe.
    Ich komme einfach nicht darauf wie es korrekt auf die Listbox anwendet wird.
    Was ich allerdings geschafft habe ist zb den Titel des Fensters zu ändern / Postition und Größe anzupassen. :)

    VB.NET-Quellcode

    1. Dim hWnd As IntPtr = FindWindow(Nothing, "WindowTitle")
    2. MoveWindow(hWnd, 100, 200, 300, 400, True)

    VB.NET-Quellcode

    1. Dim hWnd As IntPtr = FindWindow(Nothing, "WindowTitle")
    2. SetWindowText(hWnd, "Renamed!!")

    Bitte kann mir jemand erklären/helfen wie ich jetzt direkt die Listbox Einträge abfragen kann ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Regular_vb_user“ () aus folgendem Grund: -

    Regular_vb_user schrieb:

    wie ich jetzt direkt die Listbox Einträge abfragen kann ?
    Hole Dir das Handle der ListBox und experimentiere zunächst in die Richtung, dass Du auch dort den Text setzen kannst (überschreiben).
    Schreib für den ersten Test das Handle aus dem Spy++ ab, beende aber in der Zwischenzeit das Programm / Fenster nicht, weil ein neu gestartetes Programm andere Fensterhandle haben kann.
    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!
    @RodFromGermany Ich denke das wird meine letzte Frage sein.
    Das Programm läuft, allerdings bisschen langsam da es sehr viele Listbox Einträge sind (über 300).
    Ich denke mal das die Übertragung auf die .Net Listbox langsam ist, da diese etwas langsamer ist bei der Verarbeitung ?
    Die Textbox ist da schneller:

    VB.NET-Quellcode

    1. TextBox1.AppendText(output)


    Ich vermute mal das es keine direkte Funktion gibt zum "mitlesen" wenn ein neuer Eintrag in der ListBox erscheint.
    Also muss ich mir über die ListBox Item Anzahl ne Abfrage erstellen. Stimmt das so ?

    Selbst wenn ich es auf 10 Limitiere dauert es bisschen:

    VB.NET-Quellcode

    1. ​For lIndex = 0 To 10
    2. '...
    3. Next

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Regular_vb_user“ ()