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.

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

    Hi Leute,

    wie es der Titel schon sagt ist sowas mit Boardmitteln möglich?

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


    Konkret möchte ich mir ein kleines Tool basteln für folgenden Fall:

    Manchmal schaue ich am PC einen Fernsehstream im Browser und wenn die Werbung im Stream kommt stell ich per Mausklick den Ton stumm und verkleinere das Browserfenster auf "Thumbnail" Größe. Dann kann ich mit anderem beschäftigen. Durch das nicht minimieren des Streams kann ich aus den Augenwinkeln sehen, wenn die Werbung vorbei ist und stell alles wieder an. Ziel ist ein VB.net Prog. das das per Tastenkürzel auslöst (das eine Browser-Stream-Fenster 1. Stumm und 2. klein in der oberen rechten Ecke des Desktops platzieren // 3. alles wieder an die alte Position zurück)?

    Zusatzfrage kann man das auch realisieren, wenn der PC ein Vollbild-Spiel darstellt. Sprich wie kann man ein VB.net Programm mit Tastenkürzel erreichen, wenn eine Applikation den Vollbildfokus hat?
    codewars.com Rank: 4 kyu
    Moin,

    also ob die Steuerung so direkt möglich ist weiß ich nicht genau. Aber zum einem müsste man ja wissen welcher Browser - die API unterscheidet sich ja eigentlich schon ein wenig (Beispiel: im IE und EDGE kann ich per BackSpace Taste eine Seite zurück, im CHROME geht das nicht).
    Allerdings sollte alles gleich sein wenn denn die Browser in CHROMIUM laufen (somit sollte gleiche API gewährleistet werden).
    Außerdem - willst du komplett den ganzen Sound deaktivieren oder nur den vom Stream? Das eine wäre ja eine klare Anweisung ans Betriebssystem, das andere eine gezielte Anweisung an den Browser und den darin befindlichen Stream (Frage kommt wegen deinem Spiel was vlt. noch nebenbei läuft).

    Den Focus deines Fensters gewollt im Vordergrund halten, ohne, dass es jemand "wegdrücken" kann ist ja die Eigenschaft von Me.TopMost = True, somit kann drumherum passieren was will, das Fenster bleibt eingeblendet im Vordergrund.
    Tastenkürzel sollte sich auch einstellen lassen, aber ich glaube da musst du ja, wenigstens kurzzeitig solange das Programm läuft, die Registry ändern um temporär das Tastenkürzel festzulegen.
    Ja, es geht.
    Sound: siehe Thread von RfG: Mini-Audio-Manager - System-Sound bedienen
    Fenstergröße: allgemein das Thema externe .Net-Programme auslesen und manipulieren
    ganz konkret:

    VB.NET-Quellcode

    1. Dim Firefox = DirectCast(AutomationElement.RootElement.FindFirst(TreeScope.Children, New PropertyCondition(AutomationElement.ClassNameProperty, "MozillaWindowClass")), AutomationElement)
    2. DirectCast(Firefox.GetCurrentPattern(WindowPattern.Pattern), WindowPattern).SetWindowVisualState(WindowVisualState.Normal)
    3. DirectCast(Firefox.GetCurrentPattern(TransformPattern.Pattern), TransformPattern).Resize(200, 200)
    4. DirectCast(Firefox.GetCurrentPattern(TransformPattern.Pattern), TransformPattern).Move(0, 0)

    Intellisense hilft beim Import der relevanten Namespaces.

    Andere Browser haben natürlich andere Klassennamen. Wie man das rausfindet, kann ich auch beschreiben, falls gewünscht. Das Zurücksetzen in den maximierten Status bekommst Du selber hin.
    Thema HotKey: Stichwort: RegisterHotKey
    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.
    @ThomasG82 Danke für deine Antwort.

    Im Moment bin ich auf dem Lösungsweg, dass ich in einer Form "einfach" ein WebBrowser Control benutze die Url mit einer Textbox abfrage. Sprich ich denke das ist dann der Microsoft Explorer. Damit hätte ich das ganz verkleinern/vergrößern etc. erledigt da ich das über die Form machen kann.

    Was ich noch nicht finden konnte ist sowas in der Art wie "FrmMain.WebBrowser1.Audio = Mute" oder FrmMain darf kein AudioSignal erzeugen etc. . Kennt da jemand einen Ansatz?

    1. Einer Form "verbieten" Audio zu erzeugen.

    oder

    2. VB WebBrowser Control komplett Muten



    @VaporiZed Wieder mal Danke. Bin jetzt unterwegs, ich versuche dann aber deine LSG zu benutzen. Falls Du es ohne Probleme weißt, ich benutze Opera (
    Wie man das rausfindet, kann ich auch beschreiben, falls gewünscht.
    ). Würde aber auch den Firefox installieren und dann dafür den Browser nutzen ;)
    codewars.com Rank: 4 kyu

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

    Da brauchst Du kein FiFo extra dafür zu installieren.
    Mit dem hier:

    VB.NET-Quellcode

    1. Dim ClassNamesOfAllRunningApps = AutomationElement.RootElement.FindAll(TreeScope.Children, Condition.TrueCondition).Cast(Of AutomationElement).Select(Function(x) x.Current.ClassName)

    kommst Du an alle Klassennamen der laufenden Apps ran. Dadurch ergibt sich, dass Du zum Ansprechen/Manipulieren von Opera statt "MozillaWindowClass" eben (interessanterweise) "Chrome_WidgetWin_1" hernehmen musst. Hab ich ausprobiert und klappt mit der aktuellen Opera-Version.
    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 Krass es geht echt! Mal wieder erstaunlich was man alles machen kann mit Vb.net. Danke Dir ... das öffnet ja noch mal mal die Tür zu vielmehr Möglichkeiten!

    Frage wie kommt man an z.B. diese Infos oder noch andere Befehle (im OperaBrowser kann man im Tab-Reiter oben den Ton mit einem Klick abstellen -> das heißt, es müsste ja auch eine Möglichkeit geben das mit einer Programmzeile zu machen // dann könnte ich mir den Kram mit der Audio manager sparen):
    DirectCast(Firefox.GetCurrentPattern(TransformPattern.Pattern), TransformPattern).Resize(200, 200)

    ???

    Für die noch größeren Noobs als mich ;) folgendes:

    1. man sollte den Link oben von VaporiZed lesen ;) "allgemein das Thema externe .Net-Programme auslesen und manipulieren"
    2. Im Projektmappen Explorer müssen noch die 2 Dll hinzugefügt werden
    ich hab sie bei mir auf dem Rechner hier gefunden:
    'C:\WINDOWS\assembly\GAC_MSIL\UIAutomationClient\3.0.0.0
    'C:\Windows\assembly\GAC_MSIL\UIAutomationTypes\3.0.0.0
    3. im Quellcode muss man noch folgendes ergänzen ​Imports System.Windows.Automation
    codewars.com Rank: 4 kyu
    Öhm, ich benutz Opera nicht, daher find ich auf Anhieb die Stumm-Taste nicht. Wo soll die sein?
    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.
    Im Opera Browers geht das so, dass falls ein Audiosignal von der Homepage ausgegeben wird erscheint oben bei dem Tab-Reiter vor dem Namen EQ-Balken die sich bewegen, dort geklickt stellt Mute und un-Mute.

    Siehe Foto

    P. S. : Falls kein Audiosignal da ist kann man da auch nix klicken und sieht auch nix.
    Bilder
    • 1Mute.jpg

      65,01 kB, 808×526, 87 mal angesehen
    codewars.com Rank: 4 kyu
    Vorsicht - ich hab das gerade mal bei Chrome (Version 78.0.3904.108 (Offizieller Build) (64-Bit)) getestet - da kann man die Website auch stumm stellen. Bei mir ist das im Rechts-Klick-Menü -> Website stummschalten. Danach zeigt er es auch in der Adressleiste - allerdings wenn ich für die Seite die Stummschaltung deaktiviere sagt die Adressleiste immernoch, dass sie stumm geschalten ist. Also musst du, falls du das etwaige gefunden hast, prüfen ob es so richtig funktioniert.

    @nogood läuft dein Browser schon unter CHROMIUM als Engine oder noch nicht? Weil wenn es so wäre wären ja alle Befehle ab da gleich für alle Browser und somit ist das Programm universell für alle nutzbar.
    Ich hab jetzt mal auf Youtube und der ZDF Mediathek geschaut. Den TabPage-Button konnte ich (noch) nicht erfassen, aber eben die Lautstärken-An-Aus-Schalter im Videoplayer der jeweiligen Seite. Einfach mal mit .FindAll(TreeScope.Descendants, Condition.TrueCondition) alle Bestandteile der aktuellen Seite durchgehen und die Beschriftungen prüfen (NameProperty). Bei Youtube ist der Button mit Stummschalten (m) bzw. Stummschaltung aufheben (m) beschriftet und kann mit dem InvokePattern und dessen Methode Invoke "geklickt" werden. Beim ZDF ist das Ganze mit Ton abschalten bzw. Ton anschalten beschriftet.
    Hab's probiert, klappt entsprechend.
    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 die Hilfe. Ich hab mich gestern länger mit deinem Posting "externe .Net-Programme auslesen und manipulieren" beschäftigt. Und hab versucht mir die Namen aller CEs der TargetApp (OperaBrowser) in einer RichtTextBox anzuzeigen leider versteh ich immer noch nicht die ganze Logik die da hinter steckt (Instanzen Typen etc.).
    In meiner Denke hab ich das erste Objekt (Programm das auf dem Desktop "läuft") mit dem Name "Chrome_WidgetWin_1" gesucht und mir eine Liste aller CE dieses Objekts in ListOfAllCEs erstellt. Mit ListOfAllCEs.Item(2) wähle ich das dritte CE aus und jetzt will ich den Namen wissen.
    Bei mir kommt mal wieder nicht der Name des CEs sonder der Typ raus

    VB.NET-Quellcode

    1. Dim OperaBrowser = DirectCast(AutomationElement.RootElement.FindFirst(TreeScope.Children, New PropertyCondition(AutomationElement.ClassNameProperty, "Chrome_WidgetWin_1")), AutomationElement)
    2. Dim ListOfAllCEs = OperaBrowser.FindAll(TreeScope.Descendants, Condition.TrueCondition)
    3. For k = 0 To ListOfAllCEs.Count - 1
    4. RichTextBox1.Text &= ListOfAllCEs.Item(k).ToString
    5. Next



    Du hast mir ja schon gesagt was ich tun muss :P ... nur wie mach ich das mit dem "...und die Beschriftungen prüfen (NameProperty)..." . RichTextBox1.Text &= ListOfAllCEs.Item(k).name ist leider falsch (und auch diverse andere Sachen die ich versucht habe).
    -------------------------------------

    So ich glaub ich hab es doch gefunden:


    VB.NET-Quellcode

    1. Dim nameProp As String = CStr(ListOfAllCEs.Item(2).GetCurrentPropertyValue(AutomationElement.NameProperty))
    2. RichTextBox1.Text &= nameProp
    codewars.com Rank: 4 kyu

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

    @VaporiZed Soweit bin ich bis jetzt gekommen:

    VB.NET-Quellcode

    1. Dim OperaBrowser = DirectCast(AutomationElement.RootElement.FindFirst(TreeScope.Children, New PropertyCondition(AutomationElement.ClassNameProperty, "Chrome_WidgetWin_1")), AutomationElement)
    2. Dim ListOfAllCEs = OperaBrowser.FindAll(TreeScope.Descendants, Condition.TrueCondition)
    3. For k = 0 To ListOfAllCEs.Count - 1
    4. nameProp = CStr(ListOfAllCEs.Item(k).GetCurrentPropertyValue(AutomationElement.NameProperty))
    5. RtxtShowSnapShotB.Text &= k & " " & nameProp & vbNewLine
    6. If nameProp = "Tab spielt Audio ab" Then
    7. MessageBox.Show(CStr(k))
    8. '??? ist das die richtige Stelle für den invoke und wie mach ich das
    9. End If
    10. Next


    Damit kann ich mir in einer Richtextbox alle Control Elemente anzeigen lassen. Wenn ein Video im OperaWebbrowser spielt, findet man eins, das "Tab spielt Audio ab" heißt. Ich weiß jetzt nicht wie ich das nutzen soll.
    Du hast es ja oben schon mit ​DirectCast(Firefox.GetCurrentPattern(TransformPattern.Pattern), TransformPattern).Resize(200, 200) vorgemacht und später geschrieben ich soll invokePattern und die Methode invoke benutzen könntest Du da noch etwas zu schreiben.
    Ich komm nicht dahinter!
    codewars.com Rank: 4 kyu
    Steht doch alles im Thread »externe .Net-Programme auslesen und manipulieren«.
    Da dürfte dann rauskommen:

    VB.NET-Quellcode

    1. DirectCast(ListOfAllCEs(k).GetCurrentPattern(InvokePattern.Pattern), InvokePattern).Invoke
    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.
    @a.b_om Danke für den Link ... so ähnlich Sachen meine ich schon bei meiner Suche gefunden zu haben. Ohne alles zu verstehen glaube ich, dass das eine Lösung ist, um das Bing Geräusch beim Seiten Refresh zu unterdrücken. Ich suche nach der Möglichkeit den Ton eines Stream der auf der Webseite gespielt wird zu muten.

    @VaporiZed Dank deines Threads "externe .Net-Programme auslesen und manipulieren" (Link oben) bin ich nun ein ganzes Stück weiter gekommen. Ich komm an Stellen wo ich nicht weiter weiss.

    Ich habe so wie Du das Windows Programm Notepad mit meinem VB-Net Programm "gesteuert". Ich schaffe es, dass ich die "Menue-Punkte" im Programm Notepad : Datei - Bearbeiten - Format - Ansicht - Hilfe
    expandieren/öffnen/ausklappen kann mit (ExpandCollapsePatternIdentifiers.Pattern) und dann die Untermenuepunkte mit (invoke.pattern) anklicken kann.
    Bei Notepad kann ich Hilfe -> Info so ansteuern und mir so das Popupfenster anzeigen lassen. Dank Deines Tutorials.

    Bei meinem konkreten Ziel den Ton bei Streams im Opera Browser zu Muten/Unmuten fehlt mir das Wissen das richtige
    Menue/CE rauszusuchen.
    Den Button den ich dann mit meinem VB Programm in Opera eigentlich drücken will ist hier "versteckt":

    rechte Maustaste auf den BrowserTab der entsprechenden Webseite -> im dann erscheinenden Menue "Tab stumm schalten"
    (Im InternetExplorer Edge von MS ist das sehr ähnlich // Rechte Maus auf TAB -> "Tab stummschalten" )

    Wenn ich mir die möglichem Patterns für den Tab anzeigen lasse kommt als unterstütztes Pattern: ValuePatternIdentifiers.Pattern

    Da komm ich nicht weiter, wie simuliere ich den rechten Mausklick auf den Tab, um das Menue zu öffnen (invoke oder expand geht ja nicht) um dann das CE "Tab stumm schalten" ansprechen zu können.
    Danke für Hilfe
    codewars.com Rank: 4 kyu

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

    nogood schrieb:

    rechte Maustaste auf den BrowserTab der entsprechenden Webseite -> im dann erscheinenden Menue "Tab stumm schalten"
    (Im InternetExplorer Edge von MS ist das sehr ähnlich // Rechte Maus auf TAB -> "Tab stummschalten" )

    Chrome auch...

    Wenn ich es richtig verstanden habe, möchtest du einen rechtsklick auf ein Tab machen. vllt. ist hier die Lösung:
    vbarchiv.net/tipps/tipp_1946-t…-tab-reiter-erkennen.html
    @a.b_om Es geht darum mit einem eigenen Programm den Browser "fernzusteuern", es geht nicht darum in einem eigenen Programm das Ereignis rechten Maus Klick auf Tab abzufragen. Lies Dir den Link von VaporiZed durch ist interessant und dann ist auch klar was ich vorhabe.

    Für den geneigten Leser bitte in Post 16 schauen da steht drin was ich nicht hin bekomme ... Danke für Hilfe


    Für den Microsoft Edge (44.18362.449.0) hab ich schon eine grob funktionierende Lösung hinbekommen.
    Form mit 2 Buttons (An/Aus) Aus: verkleinert das Browser Fester auf 200x200 und stellt den Ton ab (nur ein Tab offen und es muss ein Stream laufen // getestet mit zdf.de und youtube). An vergrößert den Browser auf 600x600 und stellt den Ton wieder an.
    Für meinen eigentlich benutzten Browser Opera (Chrom-Abstammung) bekomme ich es aus gesagten Gründe nicht hin.

    VB.NET-Quellcode

    1. Private Sub BtAn_Click(sender As Object, e As EventArgs) Handles BtAn.Click
    2. Try
    3. Dim TargetApp = DirectCast(AutomationElement.RootElement.FindFirst(TreeScope.Children, New PropertyCondition(AutomationElement.ClassNameProperty, "ApplicationFrameWindow")), AutomationElement)
    4. Dim MyTargetCE = TargetApp.FindFirst(TreeScope.Descendants, New PropertyCondition(AutomationElement.NameProperty, "Klicken, um die Stummschaltung der Registerkarte aufzuheben"))
    5. DirectCast(MyTargetCE.GetCurrentPattern(InvokePattern.Pattern), InvokePattern).Invoke()
    6. DirectCast(TargetApp.GetCurrentPattern(TransformPattern.Pattern), TransformPattern).Resize(600, 600)
    7. Catch ex As Exception
    8. MessageBox.Show("Geht nur für geöffneten MS Edge Browser der eine Stream abspielt. 2. Mögliches Problem zu schnell geklickt Stichwort Edge Popup Stummschalten muss erst erloschen sein")
    9. End Try
    10. End Sub
    11. Private Sub BtAus_Click(sender As Object, e As EventArgs) Handles BtAus.Click
    12. '... so wie der erste Fall nur diese Änderung
    13. "Klicken, um die Registerkarte stummzuschalten")) und Resize (200, 200)
    14. '...
    15. End Sub
    codewars.com Rank: 4 kyu

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

    @a.b_om Danke für deine Mühe. Leider helfen mir dein Postings nicht wirklich. Falls Du konkret helfen kannst gerne; "googlen" kann ich auch ( :saint: :saint: bitte nicht falsch verstehen).
    codewars.com Rank: 4 kyu

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