Kann man den Browser mit einem VB.Net Programm "steuern" // Audio Stumm/An & Fenster Position und Größe

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

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von nogood.

    @nogood
    Ich verstehe es nicht falsch, aber ich habe noch nie so etwas gemacht. Jeder sucht im Google anders und die Resultate. sind auch nicht immer gleich. Ich kann nur so helfen.
    Meine Sucharten sind ein gutes Beispiel. Ich bin meistens der, der immer anders sucht als alle Anderen. Vllt. hätte ich so geholfen. Vllt. verstehe ich baer auch nicht, was du möchtest.
    Ich habe keinen Weg gefunden, nur mit UI Automation das Context Menu aufzurufen, da es erst mit Einträgen erstellt wird, wenn es angezeigt wird. Und erst dann kann man auf einen Eintrag automatisiert klicken.
    ...
    Vermutung: Wenn Du aber das Mute-Tab-Addon runterlädst, könntest kannst Du dieses invoken. Habe es ausprobiert und kann die Funktionalität des Vorhabens bestätigen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    @VaporiZed Danke das Du dir das noch mal angesehen hast!!! Ich bin beruhigt, dass Du es auch nicht sofort hinbekommen hast :P .

    Ich hab noch einen anderen Ansatz versucht. Ich hab mir eine Klickbare Cursor Position auf dem gewählten Automation ControlElement geholt und dann mit MausEvent dort einen Rechten Mausklick erzeugt/getätigt. Das Menue geht auch auf (rechte Maus auf den Tab-Reiter des Webbrowsers mit dem Stream). Ich habe mir dann das mögliche Pattern anzeigen lasse für der Eintrag "Tab stumm schalten". Es wurde doch tatsächlich das Invoke.Pattern als Möglichkeit angezeigt.

    Ich dachte jetzt hab ich es geschafft, aber leider gibt es dann doch einen Fehler "Innere Ausnahme 1 ElementNotAvailableException: Das Zielelement entspricht einer Benutzeroberfläche, die nicht mehr verfügbar ist (z. B., weil das übergeordnete Fenster geschlossen wurde)".

    Was ich nun nicht verstehe ist, warum klappt die Abfrage nach dem Pattern aber der Invoke nicht?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'CursorPosition
    2. 'setzt den Cursor mittig obere Kante des gewählten CEs
    3. 'muß ein AutomationElement sein
    4. Dim clickablePoint As System.Windows.Point = MyTargetCE.GetClickablePoint()
    5. System.Windows.Forms.Cursor.Position = New System.Drawing.Point(CInt(clickablePoint.X), CInt(clickablePoint.Y))
    6. Dim x, y As Int32
    7. x = System.Windows.Forms.Cursor.Position.X
    8. y = System.Windows.Forms.Cursor.Position.Y
    9. 'Sende MauseEvent RechteMaustaste drücken und lösen an der Stelle des Cursors (hier auf den Tab des Browsers)
    10. mouse_event(MOUSEEVENTF_RIGHTDOWN, x, y, 0, 1)
    11. mouse_event(MOUSEEVENTF_RIGHTUP, x, y, 0, 1)
    12. '-> RechteMauseTastenmenue ist offen
    13. TargetApp = DirectCast(AutomationElement.RootElement.FindFirst(TreeScope.Children, New PropertyCondition(AutomationElement.ClassNameProperty, "Chrome_WidgetWin_1")), AutomationElement)
    14. MyTargetCE = TargetApp.FindFirst(TreeScope.Descendants, New PropertyCondition(AutomationElement.NameProperty, "Tab stumm schalten"))
    15. ''Invoke Pattern für "Tab stumm schalten" wird auch gefunden
    16. 'SupportedPatterns = MyTargetCE.GetSupportedPatterns
    17. DirectCast(MyTargetCE.GetCurrentPattern(InvokePattern.Pattern), InvokePattern).Invoke() 'beim Invoke kommt dann überraschend der Fehler


    Hast Du oder Irgendwer noch eine Idee wie man da weiter kommt?
    Falls nicht löse ich es dann über das Plugin.

    Ach so noch eine zweite Frage:
    Kann man die Größe des Browser-Fensters vor dem Resize noch abfragen?
    ​DirectCast(xyzBrowser.GetCurrentPattern(TransformPattern.Pattern), TransformPattern).Resize(200, 200)
    Ich habe das noch nicht gefunden.
    codewars.com Rank: 4 kyu

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

    nogood schrieb:

    Kann man die Größe des Browser-Fensters vor dem Resize noch abfragen?
    Ja, aber dafür braucht es kein Pattern:

    VB.NET-Quellcode

    1. xyzBrowser.Current.BoundingRectangle
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed: Danke für deinen Input! Im Grunde ist ja jetzt alles erreicht was ich mir vorgenommen habe. Fehlt "nur" noch die Implementierung von globle Hotkeys. Da scheint es aber ne Menge Infos im Netz zu geben.
    Ist aber auch wieder etwas was ich noch nie gemacht habe... Ich melde mich mal wenn ich es fertige bekommen habe. Also Danke für deine Unterstützung (ohne wäre es nichts geworden).
    LG


    ------
    @a.b_om Ich hab dann ja doch eine Idee von deinen Links weiterverfolgt (Mausklick an Curser Position erzeugen). Also war es doch hilfreich :)
    codewars.com Rank: 4 kyu
    Das Contextmenü auseinanderzunehmen stellt sich als etwas schwierig heraus, weil es verschwindet, sobald man irgendwo anders hinklickt. Und wenn es neu aufploppt, ist es nicht mehr dasselbe und daher sind die UI Automation-Verweise dann ungültig. Aber selbst wenn ich mit Tricks arbeite, komm ich nicht ans Ziel. Allerdings scheint ja auch ein simulierter Linksklickauf die Stelle zu reichen, um das Ding stumm zu schalten. Also am besten Contextmenü ignorieren und mit Linksklick oder dem Addon arbeiten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    So weit so gut ... im Grunde genommen geht schon das meiste was ich mit vorgenommen habe.
    (Browser mit App inkl. Hotkey verkleinern und stumm stellen wenn im VideoStream Werbung kommt und danach per Hotkey wieder alles Herstellen)

    Was schon geht (Lösung mit dem Plugin Mute Tab):
    -richtige Instanz des Browsers suchen auf den die Fernsteuerung dann wirken soll (ein Browserfenster zum Stream schauen und ein anderes zum was auch immer)
    -Mute / Unmute
    -globle Hotkey
    -Größe des Browsersfenster ändern

    Wo ich Probleme habe:
    Browserfenster ist Maximiert und ich will es "resizen" auf klein (200x200). Über folgenden Umweg erstmal auf WindowVisualState.Normal und dann resize soweit alles i.O. ('WindowVisualState 0=normal 1=max 2=min). Direkt ein Maximiertes Fesnter zu resizen ging nicht.

    VB.NET-Quellcode

    1. Dim Browser = DirectCast(AutomationElement.RootElement.FindFirst(TreeScope.Children, New PropertyCondition(AutomationElement.NameProperty, BrowserName)), AutomationElement)
    2. If WindowSizeState = 0 Then
    3. DirectCast(Browser.GetCurrentPattern(TransformPattern.Pattern), TransformPattern).Resize(SmallBrowserWidth, SmallBrowserHeight)
    4. Else
    5. DirectCast(Browser.GetCurrentPattern(WindowPattern.Pattern), WindowPattern).SetWindowVisualState(WindowVisualState.Normal)
    6. DirectCast(Browser.GetCurrentPattern(TransformPattern.Pattern), TransformPattern).Resize(SmallBrowserWidth, SmallBrowserHeight)
    7. End If


    Was ich nicht lösen konnte war, dass ich es nicht hinbekomme nachher das Fenster wieder auf Maximiert zu setzen. Ich bekomme keine Fehlermeldung. Ich hör nur den Windows Bing Ton als ob ich auf eine "gesperrte Form klicke" beim auslösen des Codes zum maximieren.
    So will ich eigentlich den Ursprungszustand wieder herstellen ​DirectCast(Browser.GetCurrentPattern(WindowPattern.Pattern), WindowPattern).SetWindowVisualState(WindowVisualState.Maximized).
    Jemand eine Idee was ich machen könnte.


    Was ich noch lösen möchte aber noch nicht angefangen habe:
    -Beim verkleinern und stumm stellen das Browserfenster automatisch in die obere rechte Ecke des Bildschirmes zu verschieben (und dann wieder an die alte Stelle beim zurückholen)
    -und wenn ich dann immer noch Lust habe -> per My.Settings Einstellungen für andere Browser Typen in der App zu hinterlegen, damit es nicht nur mit dem Opera Browser funzt.

    Jetzt wäre die erste Hürde das zurücksetzten auf Maximized. Danke für alle bisherigen Vorschläge ... falls es jetzt so bleibt wie es ist wäre es auch schon gut zu benutzen :)
    codewars.com Rank: 4 kyu
    Das Maximize-Problem konnte ich nachvollziehen und umgehen. Einfach vorher noch eine Transformation (Resize auf z.B. 500x500) durchführen, bevor der Maximized-Status gesetzt wird.

    nogood schrieb:

    Beim verkleinern und stumm stellen das Browserfenster automatisch in die obere rechte Ecke des Bildschirmes zu verschieben (und dann wieder an die alte Stelle beim zurückholen)
    Ja gut, da brauchst Du Dir ja nur die Daten vom BoundingRectangle zu merken, über Windows.Forms.Screen.PrimaryScreen.WorkingArea Dir die Daten Deiner Auflösung zu holen und mit dem TransformPattern per Move das Fenster zu verschieben.
    Und bei den My.Settings: Da geht's ja nur um die Namen, die man zur Identifikation der Browser für die ClassNameProperty braucht. Opera hast Du, Firefox habe ich schon in meinem ersten Post genannt und die anderen sind ja nicht weit. Nicht probiert, aber die Antwort scheint sich z.B. in Post#1 dieses autohotkey-Threads zu befinden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Moin,

    Danke, Danke, Danke... es funktioniert. Falls Interesse bestehen sollte, kann ich auch gerne das Projekt als .zip hochlanden. Zwei Sachen dazu, das Programm ist nicht wirklich ausgereift. Erstens es wird bestimmt ne Menge Möglichkeiten geben das Programm zum Absturz zu bringen etc.. Zweitens der Code und der Aufbau ist 100% sub optimal (ist mein erstes HobbyJahr :rolleyes: mit Vb.net). Spezial Thx @VaporiZed

    --------
    Positionierung der Fenster und das wiederherstellen eines Maximierten-Fensters hab ich noch umgesetzt (Maximierung ging bei mir nicht mir dem Zwischenschritt Resize. Ich hab es dann 'FacePalm' mit Invoke.Pattern "Maximieren" des Browser-CEs gelöst).
    Das Hinterlegen von Steuer-Strings für andere Browser in My.settings kommt vielleicht noch, vielleicht auch nicht.
    codewars.com Rank: 4 kyu