Seite 1 von 1

Shell Overlay Icons

Verfasst: 23.10.2020, 13:48
von Jonathan
Jonathan hat geschrieben: 27.12.2019, 20:45 Windows kann ja nur 15 ShellIconOverlayIdentifiers, aber die meisten Tools wie tortoiseGit oder alles was irgendwie mit Cloud zu tun haben belegen in der Regel mindestens ein halbes dutzend davon - so dass man effektiv höchstens 2 Tools mit funktionierenden Icons haben kann. Weil die Priorität nach der alphabetischen Sortierung geht, gibt es einen Kampf wer mehr Sonderzeichen an den Anfang setzen kann um in der Liste ganz vorne zu stehen.

Meine TortoiseGit Icons die alle mit zwei Leerzeichen anfangen wurden gerade von dem neuen Seafile-Update besiegt - die mit einer Kombination aus 3 Leerzeichen, Anfürungszeichen sowie Punkt in die Schlacht ziehen. Was für egoistische Würstchen programmieren eigentlich diese Installer denen scheißegal ist ob der Rest des Systems danach noch funktioniert, hauptsache die eigenen Icons werden angezeigt? Alles nur damit die Supportanfragen an jemand anderen gehen oder wie? Und wer denkt sich einen so saudummen Präfix aus? Wenn man schon 5 Zeichen verwendet, wieso ist man dann nicht wenigstens effizient und benutzt immer das beste (-> am weitesten vorne stehende)? Das ist doch alles ein großer Quatsch...

Und warum schaffen es die, uhm, Menschen von Microsoft immer neue Telemetriescheiße zu implementieren, aber elementare und vollkommen absurde Einschränkungen werden über Dekaden nicht gepatcht? Und was habe ich überhaupt der Welt schlimmes angetan, dass sich scheinbar alle gegen mich verbündet haben und mich mit ihren mutwillig schlechten Lösungen dazu zwingen meine wertvolle Arbeitszeit in sinnlose Internetrants zu verschwenden?

Die Alternative wäre ja, sich ein kleines Tool zu schreiben, mit denen man derlei Wildwüchse bequem neu sortieren kann. Aber das dauert wieder zwei Stunden und irgendwie bin ich immer zu faul dafür und mache es dann doch wieder per Hand (so alle 1-2 Monate einmal, und das seit Jahren...). Nerv.
(Dabei fällt mir gerade ein, dass man genau das als Installer-Plugin vertreiben könnte. Das wäre dann nämlich die eigentlich korrekte Lösung: Darauf hinweisen, dass es ein Problem gibt dass Microsoft sich weigert zu patchen und dann dem Benutzer die Möglichkeit geben selbst zu entscheiden welche Icons welcher aktuell installierten Programme er sehen möchte.)


Nun, ich war es endlich satt und habe mir ein Python Script geschrieben. Das ganze solltet ihr nicht wirklich ausführen ohne es vorher gelesen und angepasst zu haben. Aber wenn ihr jemals eure Overlayicons auf eine ähnliche Art editieren wollt, ist es vielleicht kein schlechter Ausgangspunkt.
(man beachte auch die angegebene Quelle. Ich fand das Skript dort aus verschiedenen Gründen nicht so gut weswegen ich meine eigene Version geschrieben habe, ist aber sicherlich trotzdem einen Besuch wert).

(Skript muss mit Admin-Rechten ausgeführt werden, außer wenn dry_run=True ist)

Code: Alles auswählen

import codecs
import os
import winreg as reg

# with help from: https://cito.github.io/blog/overlay-icon-battle/

# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# !!!!!!!!!!!!!!!!!!! IMPORTANT !!!!!!!!!!!!!!!!
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# change this value
dry_run = True



def main():
	key = r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers"
	sub_key = key.split('\\', 1)[1]
	print(key)
	print(sub_key)

	application_names = ["SeafileExtIcon", "Tortoise", "AccExtIco", "OneDrive"]

	# new prefix for each application to change alphabetic sorting.
	# additional spaces can be used to increase priority
	new_prefix = {
		"SeafileExtIcon": " ",
		"Tortoise": "  ",
		"OneDrive": "",
		"AccExtIco": ""
	}


	with reg.OpenKey(reg.HKEY_LOCAL_MACHINE, sub_key) as base:
		i = 0

		# get all keys:
		keys = list()
		while True:
			try:
				name = reg.EnumKey(base, i)
				value = reg.QueryValue(base, name)
				#print(name, value)
				keys.append((name, value))
			except OSError as e:
				print(e)
				break
			i += 1

		for name, value in keys:
			# check if the key matches any known application
			found = False
			for a in application_names:
				if a in name:
					found = True
					old_prefix = name[:name.find(a)]
					if old_prefix != new_prefix[a]:
						print('Bad Key: **{}** {}'.format(name, value))

						# strip the prefix (added spaces, numbers, dots, etc.)
						new_name = new_prefix[a] + name[name.find(a):]
						print("-> **{}**".format(new_name))

						# rename by creating new key and deleting the old one:
						if not dry_run:
							reg.CreateKey(base, new_name)
							reg.SetValue(base, new_name, reg.REG_SZ, value)

							#print("Delete", name)
							reg.DeleteKey(base, name)
					else:
						print("Good Key:", name)

						# only process one application
						break
			if not found:
				print("unknown key: **{}**".format(name))

if __name__ == "__main__":
	main()