derwowusste
Goto Top

Chrometabs programmatisch zählen

Moin Kollegen.

Ich suche einen Weg, wie ich per Skript ermitteln kann, wie viele Tabs ein Nutzer in Chrome offen hat. Es wäre zu einfach, wenn dies über die Anzahl der chrome.exe-Prozesse ginge - leider nein. Manchmal ist nur ein Tab offen, aber es laufen für diesen Nutzer bis zu 9 Chromeprozesse.

Hat jemand den Durchblick?

Content-ID: 364782

Url: https://administrator.de/contentid/364782

Ausgedruckt am: 24.11.2024 um 15:11 Uhr

emeriks
emeriks 14.02.2018 um 17:51:33 Uhr
Goto Top
Hi DWW,
he he. Letztens hatte ich selbe Aufgebenstellung beim FireFox. face-smile
Da habe ich auch keinen Ansatz. Sicher ist, dass er beim FF für neue Tabs einen neuen Prozess startet oder einen freien nimmt. Wenn man einen Tab schließt, dann beendet er offenbar nicht den dafür bereits gestarteten Prozess, dieser wird dann "frei".

Wenn Du da eine Lösung für den Chrome findest, dann wäre ich interessiert. Vielleicht kann ich das dann für den FF adaptieren.

E.
135333
135333 14.02.2018 um 18:11:16 Uhr
Goto Top
DerWoWusste
DerWoWusste 14.02.2018 um 19:10:38 Uhr
Goto Top
Moin.

Tja, snapdragon, das ergooglet man schnell, aber was mache ich damit? Ich stecke da nicht wirklich drin, um das zu verwerten.
Epixc0re
Epixc0re 14.02.2018 um 20:47:18 Uhr
Goto Top
Kannst Du Extensions im Chrome nach installieren? Dann könnte man da was bauen ...
DerWoWusste
DerWoWusste 14.02.2018 um 20:50:09 Uhr
Goto Top
Ja klar, das könnte ich wohl, wenn's nicht anders geht.

Wenn es aber keine naheliegende Lösung gibt, wird es wohl doch auf die Zählung der chrome-Prozesse hinauslaufen Auch wenn die nicht immer so aussagekräftig ist, so besteht ja doch eine Korrelation von Tabs und Prozessen.
Epixc0re
Epixc0re 14.02.2018 um 21:01:28 Uhr
Goto Top
Ok, Vorschlag: chrome Extension welche auf close/Open Events für tabs reagiert und die Anzahl dann in ein temp file schreibt, welches Du dann einlesen kannst - was haltest Du davon?

lG,
Stefan
DerWoWusste
DerWoWusste 14.02.2018 um 21:08:44 Uhr
Goto Top
Wenn der Sourcecode vorliegt, gerne.
Epixc0re
Epixc0re 14.02.2018 um 21:17:38 Uhr
Goto Top
Ich Tipp Dir das morgen mal runter, bin grad 500km gefahren & im Bett gelandet!

lG,
Stefan
DerWoWusste
DerWoWusste 14.02.2018 um 21:47:19 Uhr
Goto Top
Nur wenn's leicht fällt.
Die Prozesse setzen sich offenbar aus Extensions (je einer pro Extension) plus der Anzahl der Tabs zusammen +2, welche ich nicht verstehe, aber was soll's. Da die meisten hier die gleiche Anzahl von Extensions haben, kann ich also auch so schon genau genug überblicken, wie viele Tabs jeder offen hat, indem ich die chrome-Prozesse zähle und einen festen Wert abziehe.
colinardo
colinardo 15.02.2018 aktualisiert um 11:23:55 Uhr
Goto Top
Servus DWW,
könnte dir das auch ohne Extension schnell als C# EXE für Chrome und Firefox zusammenschreiben.
Wenn noch Interesse besteht einfach melden.

Grüße Uwe
rubberman
rubberman 15.02.2018 um 11:30:56 Uhr
Goto Top
Hallo Uwe,

aus Interesse - wo greifst du an, um die Anzahl Tabs zu ermitteln? Ich hab gestern mal Spy angeworfen um zu sehen was ich für Fenster-Handles von Chrome bekomme. An der Stelle bin ich nicht weitergekommen da ich keine Handles von den Tabs bekommen habe, die inaktiv waren.

Steffen
colinardo
colinardo 15.02.2018 aktualisiert um 11:53:00 Uhr
Goto Top
Hallo Steffen.
Stichwort UIAutomationClient.dll ist heute im .NET Framework mit dabei.
https://msdn.microsoft.com/de-de/library/system.windows.automation(v=vs. ...
Und liegt hier
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF\UIAutomationClient.dll"
Zusätzlich einzubinden ist
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF\UIAutomationTypes.dll"

Nützlich zur Entwicklung ist dabei auch das GUI inspect.exe Tool aus dem Windows SDK.
https://msdn.microsoft.com/en-us/library/windows/desktop/dd318521(v=vs.8 ...

Grüße Uwe
rubberman
rubberman 15.02.2018 um 11:54:39 Uhr
Goto Top
Thx Uwe, schau ich mir heute Abend mal an face-smile

Steffen
colinardo
Lösung colinardo 15.02.2018 aktualisiert um 12:09:14 Uhr
Goto Top
So hier mal schnell was zum probieren:

.NET4 als Konsolenanwendung
BrowserTabCount_364782.zip


Aufruf dann für chrome so
Browsertabcount.exe -chrome
oder für den Feuerfux
Browsertabcount.exe -firefox

Angetestet auf Windows 10 Enterprise (letztes Build) x64 und als Veteran Windows 7 x64 mit aktuellen Browser-Versionen.

Ausgegeben wird nur die reine Anzahl der Tabs.

Wenn man die Titel der Tabs haben möchte das geht bei Bedarf auch problemlos.
rubberman
rubberman 15.02.2018 um 13:05:54 Uhr
Goto Top
Hallo Uwe,

funktioniert, hab das Tool aber ausgetrickst indem ich ein zweites Chrome Fenster aufgemacht habe. Im ersten hatte ich 3 Tabs, im zweiten einen. Je nachdem welches Fenster in Z Richtung am meisten vorn liegt, gibt mir das Tool entweder 3 oder 1 zurück.

Steffen
colinardo
colinardo 15.02.2018 aktualisiert um 13:20:09 Uhr
Goto Top
Zitat von @rubberman:

Hallo Uwe,

funktioniert, hab das Tool aber ausgetrickst indem ich ein zweites Chrome Fenster aufgemacht habe. Im ersten hatte ich 3 Tabs, im zweiten einen. Je nachdem welches Fenster in Z Richtung am meisten vorn liegt, gibt mir das Tool entweder 3 oder 1 zurück.
Ja das habe ich auch schon bemerkt das liegt daran das der MainWindowHandle je nach Fokus zwischen den Prozessen springt auf die schnelle hab ich das jetzt noch nicht berücksichtigt.
DerWoWusste
DerWoWusste 15.02.2018 aktualisiert um 14:35:05 Uhr
Goto Top
Was soll ich sagen? face-smile face-smile
Uwe, wie immer großartig. Klappt wie eine 1.

Ich nutze das übrigens, um Nutzer etwas zu zügeln, die unseren RD-Host mit bis zu 60 Chrometabs doch ein wenig ausbremsen.
Deployed ist das nun sehr einfach: einen geplanten Task im Nutzerteil der GPO deployen, der nur auf dem RDHost erstellt wird und stündlich im Nutzerkontext ausgeführt wird. Wenn das Resultat > 20 ist, bekommen die Nutzer nun ein schönes Popup, das sie doch bitte nicht nur Tasks öffnen, sondern auch hin und wieder ein paar schließen sollen.
emeriks
emeriks 15.02.2018 um 14:39:04 Uhr
Goto Top
Deployed ist das nun sehr einfach: einen geplanten Task im Nutzerteil der GPO deployen, der nur auf dem RDHost erstellt wird und stündlich im Nutzerkontext ausgeführt wird. Wenn das Resultat > 20 ist, bekommen die Nutzer nun ein schönes Popup, das sie doch bitte nicht nur Tasks öffnen, sondern auch hin und wieder ein paar schließen sollen.
Und damit machst Du Dich dann wieder beliebt ... face-wink
colinardo
colinardo 15.02.2018 aktualisiert um 14:45:47 Uhr
Goto Top
So, der Fehler das weitere Fenster mit Tabs sowohl bei Firefox und Chrome nicht berücksichtigt wurden ist mit dem aktuellen Build behoben. Link oben bleibt gleich. Edge und IE werde ich bei Zeiten eventuell noch hinzufügen wenn die Nachfrage da ist.
DerWoWusste
DerWoWusste 15.02.2018 aktualisiert um 14:51:57 Uhr
Goto Top
@colinardo:
Welche Versionsnummer hat der Build, welcher mehrere Fenster berücksichtigt? Der Link oben gibt mir noch die alte 0.5.0.1
@emeriks
NIcht beliebt, aber gefürchtet.
rubberman
rubberman 15.02.2018 um 15:06:01 Uhr
Goto Top
Zitat von @DerWoWusste:
Der Link oben gibt mir noch die alte 0.5.0.1
Nope. 0.5.0.20
DerWoWusste
DerWoWusste 15.02.2018 um 15:13:01 Uhr
Goto Top
Ah-jetzt-ja. Eine 0.5.0.20!
rubberman
rubberman 16.02.2018 um 17:37:13 Uhr
Goto Top
Hallo Uwe

Ich hab gestern mal versucht dein Programm nachzustellen (OK ich gebe zu ich habe mir den Plaintext in deinem Tool angesehen um zu wissen mit was du gearbeitet hast face-wink ). Ich bin fast verzweifelt weil es nur sporadisch funktioniert hat. Dann ist mir aufgefallen, dass ich immer 0 zurück bekommen habe, wenn Chrome in die Taskleiste minimiert war. Wenn das Fenster nur im Hintergrund liegt, bekomme ich die korrekte Anzahl Tabs. Also hab ich nochmal mit deinem Tool getestet und gemerkt dass es sich genauso verhält. (Win10 Home 32 Bit, Version 1609. Bin leider heute nicht dazu gekommen das noch mal auf einer anderen Maschine zu verifizieren.) Hab bislang nicht rausgefunden wo der Fehler liegt, wollte dich aber zumindest informieren. Vermutlich findest du den Fehler schneller.

Steffen
colinardo
colinardo 17.02.2018 aktualisiert um 13:22:45 Uhr
Goto Top
Offensichtlich hängt Chrome die Tabs aus der Fenster-UI aus so lange es minimiert ist. Bei Firefox ist das nicht der Fall. Das ist ein Problem. Ich würde jetzt als Workaround höchstens einen temporären programmatischen Restore des(r) Fenster(s) (im Hintergrund) erwägen. Mal sehen ob ich noch eine andere Möglichkeit finde.

- edit 11:03 - Workaround für Chrome eingebaut wenn Fenster minimiert sind. (Link wie oben) 0.5.0.25.
rubberman
rubberman 17.02.2018 um 13:20:23 Uhr
Goto Top
Ah, okay. Heißt, da muss die WinAPI noch ein bisschen herhalten. Verstanden.

Grüße
Steffen
rubberman
rubberman 18.02.2018 aktualisiert um 16:48:09 Uhr
Goto Top
Für das Restore habe ich auch kein Workaround gefunden. Aber vielleicht 2 Vorschläge für Chrome:
- Nutze IsIconic() statt GetWindowPlacement(), dann sparst du dir das Overhead der WINDOWPLACEMENT Struktur.
- Suche nach dem ersten Tab, statt nach dem Button mit Name "Neuer Tab" oder "New Tab". Somit wird das ganze sprachunabhängig.
PropertyCondition findCond = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.TabItem);
AutomationElement firstTab = AutomationElement.FromHandle(hWnd).FindFirst(TreeScope.Descendants, findCond);
if (firstTab != null)
  cnt += TreeWalker.ControlViewWalker.GetParent(firstTab).FindAll(TreeScope.Children, findCond).Count;
Grüße
Steffen
colinardo
colinardo 18.02.2018 aktualisiert um 20:44:12 Uhr
Goto Top
Stimmt, das gibt's ja auch noch, danke, Brett vorm Kopp.
Jepp solange sie die UI nicht umbauen und sich da nicht noch ein anderes Tabitem davor verkrümelt, ok face-smile.
rubberman
rubberman 18.02.2018 aktualisiert um 21:29:35 Uhr
Goto Top
solange sie die UI nicht umbauen
Davor bist du nicht gefeit. Wenn der Klassenname dann nicht mehr mit "Chrome_WidgetWin" anfängt, hast du auch verloren face-wink

und sich da nicht noch ein anderes Tabitem davor verkrümelt
Ich hatte anfangs die komplette Struktur nach TabItems durchsucht. Dann bekommst du auch das richtige Ergebnis, dauert aber länger als nach dem ersten Fund nur die Children zu sammeln. (Es ist mir sowieso ein Rätsel warum das gefühlte Ewigkeiten dauert. Bei der handvoll Elemente die Inspect zeigt, sollte das Ergebnis in wenigen Millisekunden vorliegen.)
rubberman
rubberman 23.02.2018 um 18:46:12 Uhr
Goto Top
Ah, sehe gerade du hast noch mal ein Update nachgeschoben face-smile
Eine Macke hat das Chrome Workaround noch. Das aktive Fenster verliert den Focus beim Restore und bekommt ihn auch nicht automatisch wieder. Hab das bei mir mit zwei zusätzlichen API Aufrufen gelöst:
...
if (iconic) {
  IntPtr hFgWnd = GetForegroundWindow();
  ShowWindow(hWnd, 4u /* SW_SHOWNOACTIVATE */);
  ShowWindowAsync(hWnd, 0u /* SW_HIDE */);
  SetForegroundWindow(hFgWnd);
}
...
Gruß
Steffen