Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Windows - benutzerdefinierte Symbole zu Dateitypen (https://www.delphipraxis.net/197639-windows-benutzerdefinierte-symbole-zu-dateitypen.html)

MicMic 23. Aug 2018 20:14

Windows - benutzerdefinierte Symbole zu Dateitypen
 
Hallo,
kann das gerade nur in Windows 10 prüfen.

Man kann ja für jeden Ordner ein eigenes Symbol zuordnen.
Dies geht dann z.B. auch für Dateien mit der Endung ".url" oder Verknüpfungsdateien (*.lnk) können unterschiedliche Symbole (also für jede .lnk Datei extra) aufweisen.

DLL-Dateien oder INI-Dateien haben dagegen ein zugeordnetes Symbol, sprich alle DLL-Dateien bzw. INI-Dateien haben dasselbe Symbol. Im Windows Eigenschaftsfenster findet sich hier keine "Symbol ändern" Schaltfläche an. War das schon immer so in jeder Windows-Version?

Ich dachte ja, so eine Textdatei (.txt) kann wiederum ein benutzerdefiniertes Symbol haben aber auch hier haben alle dann ein einheitliches Symbol.

Ich frage mich wie es mit Word-Dateien ausschaut (kein Word installiert)? Das müsste doch gehen... wobei ich schon zweifle da ".txt" Dateien in Windows auch alle ein selbes zugeordnetes Symbol haben. Oder ich finde nicht wirklich den Ort zum ändern des Symbols :)

Auch vermisse ich bei ".bat" Dateien eine "Symbol ändern" Schaltfläche. Ich dachte das geht. Also "starten.bat" und "beenden.bat" unterschiedliche Symbole zuordnen. Aber das geht nicht. Natürlich wieder als Verknüpfung... klar das geht. Jedenfalls kann man bei ".exe" Dateien auch kein Symbol abändern, wobei hier ja jede EXE wiederum ein eigenes Symbol haben kann.

Eigentlich müsste ich wissen, welche Dateiendungen evtl. ein benutzerdefiniertes Symbol haben kann (aber natürlich nicht muss und ein zugeordnetes von Windows genutzt wird). So viele Dateiendungen müssten es dann ja nicht sein.

Gruß
Michael

KodeZwerg 23. Aug 2018 20:36

AW: Windows - benutzerdefinierte Symbole zu Dateitypen
 
Wenn es sich um das auslesen handelt, so gehe ich vor, vielleicht gibt es alternativen?
'Computer\HKEY_CLASSES_ROOT\' + '.ext' den Default Wert als String Auslesen.
Prüfen ob der String ne Datei ist oder so weiter machen:
'Computer\HKEY_CLASSES_ROOT\' + ResultStringVonOben + '\DefaultIcon\' den Default Wert als String Auslesen.
Prüfen ob der String ne Datei ist oder so weiter machen:
'Computer\HKEY_CLASSES_ROOT\' + ResultStringVonGerade + '\DefaultIcon\' den Default Wert als String Auslesen.
Nun solltest Du Datei mit Icon + Optional IconIndex von einer '.ext' kennen.
(tiefere Verwurzelungen sind mir pers. noch nicht begegnet, bei Bedarf halt immer wieder rein bis man als Result ne Datei hat)

War das Deine Frage?

edit
Hinweis:
Ausgelesener String wird bei optionalen IconIndex mit einem kommata getrennt. Am besten mal in Registry reinschauen damit Du verstehst was ich meine.

MicMic 23. Aug 2018 21:12

AW: Windows - benutzerdefinierte Symbole zu Dateitypen
 
Also um es verständlicher zu machen.
Ich lade für mein Programm erst mal die Standard-Symbole. Später werden benutzerdefinierte Symbole nachgeladen. Dies kostet Zeit und die Zeit will ich noch verkürzen. Wenn es dann z.B. zu ".dll" Dateien wirklich keine unterschiedlichen Symbole gibt, brauch ich auch nicht die Lade-Routine starten. Ein Standard-Symbol habe ich ja schon. Die Lade-Routine würde mir ja dann genau das gleiche liefern. Das wäre doppeltes laden und nutzlos. So würde ich dann auch mit anderen Dateitypen umgehen. Nur brauch ich es andersrum, sprich keine Prüfung von den Dateiendungen die nur ein Standard-Symbol haben (da müsste ich ja alle möglichen Dateiendungen prüfen), sondern das prüfen der Dateiendungen die benutzerdefinierte Symbole haben können. Somit könnte man alle anderen ausschließen und die Lade-Routine für Symbolnachladungen erst gar nicht starten.

In die Registry schaue ich morgen mal rein. Evtl. kann man sich durch Daten eine Prüfungsroutine zusammenstricken. Man braucht halt am Ende die Info für welche Dateiendung man nachladen muss.

".exe" ist klar. ".msc", ".lnk", ".url" ebenfalls. Das wäre dann jetzt eine optische Prüfung und eine technische will ich mir dann irgendwie zusammenbauen.

Schönes Wochenende schon mal

Michael

Dalai 23. Aug 2018 22:34

AW: Windows - benutzerdefinierte Symbole zu Dateitypen
 
Zitat:

Zitat von MicMic (Beitrag 1411465)
Im Windows Eigenschaftsfenster findet sich hier keine "Symbol ändern" Schaltfläche an. War das schon immer so in jeder Windows-Version?

Ja und nein. Die Registerkarte "Anpassen" hat Win7 in Bezug auf Datei(typ)en noch nicht, bei Verzeichnissen gibt's das schon seit XP. Dennoch konnte man bis einschließlich XP die Symbole von Dateitypen ändern, nämlich via Systemsteuerung > Ordneroptionen > Dateitypen. Mit Vista (oder Win7) fiel diese Möglichkeit weg, weswegen es nach und nach eine Reihe von Tools gab, die diese Optionen nachbildeten.

Nicht verknüpfte Dateitypen haben generell ein generisches Symbol, meist ein weißes Blatt Papier oder sowas in der Richtung.

Üblicherweise fragt man das System, welches Symbol ein bestimmter Dateityp hat, z.B. mit MSDN-Library durchsuchenSHGetFileInfo oder MSDN-Library durchsuchenExtractAssociatedIcon.

Grüße
Dalai

MicMic 24. Aug 2018 04:33

AW: Windows - benutzerdefinierte Symbole zu Dateitypen
 
Es ist wohl nicht so richtig deutlich was ich meine.

Meine Lade-Routine besteht aus SHGetFileInfo.
Bei Programmstart nutze ich hier "SHGFI_USEFILEATTRIBUTES", um ein Standard-Symbol zu einem Dateityp zu bekommen. Später werden dann speziellen Icons nachgeladen. Also Symbole aus ".exe" Dateien oder aber auch spezielle Ordner-Symbole. Wenn man nun SHGetFileInfo auf ein Verzeichnis mit tausenden Dateien einsetzt, dauert es natürlich etwas länger, als wenn man nur 3 Dateien über SHGetFIleInfo jagt. Deswegen meine Frage bezüglich den "benutzerdefinierten Icons". Die sind wohl nicht bei allen Dateitypen einstellbar. Also...

"datei1.dll" Symbol A
"datei2.dll" Symbol B

scheint nicht zu gehen, sondern es gibt nur ein normales zugeordnetes Symbol für alle DLL-Dateien. Wenn das so ist, braucht man auch nicht mit SHGetFileInfo ein spezielles Icon suchen. Diese Zeit könnte man einsparen und sich nur auf das zugeordnete Icon konzentrieren. So könnte man dann für andere Dateitypen (Dateiendungen) auch verfahren. Deswegen müsste man wissen, bei welchen Dateiendungen man versuchen sollte, spezielle Icons zu laden. Bei den anderen nutzt man dann einfach das hinterlegte Standard-Symbol eines Dateityps.

Michael

Ghostwalker 24. Aug 2018 05:43

AW: Windows - benutzerdefinierte Symbole zu Dateitypen
 
Wie KodeZwerg schon sagte, könntest du vorab in der Registry checken, ob eine eine Endung ein specifisches Symbol hat oder nicht.

Sollte eines hinterlegt sein ->Das nehmen
Ansonsten -> eigenes rein.

KodeZwerg 24. Aug 2018 09:07

AW: Windows - benutzerdefinierte Symbole zu Dateitypen
 
Eine Möglichkeit wäre noch, mit meiner Registry Methodik von oben, den Dateinamen zu checken. ImgRes.dll und so etwas enthalten Standard-Icons, blätter einfach mal die Registry ein wenig durch um die Liste der Standards zu erweitern. Ich kenne leider nicht alle aus dem Kopf heraus, aber das wäre noch eine Möglichkeit.

Oder micro-Vorab-Test mit dem Verzeichnis Namen, wenn sich Datei nicht in \Windows\ (oder +sub) befindet kann man eigentlich zu 100% von einem UserIcon ausgehen.


PS:
Wenn Du über PIDLs das ganze verwirklichst, ist Geschwindigkeit so schnell wie Windows selbst. (ShellApi)

Delphi.Narium 24. Aug 2018 12:40

AW: Windows - benutzerdefinierte Symbole zu Dateitypen
 
Also (unwissenschaftich und eher umgangssprachlich ohne Anspruch auf abolute Korrektheit ... formuliert):

Du hast eine Datei.
Nimmst deren Endung.
Schaust nach, ob in der Registry ein Symbol vorgegeben ist.
Wenn ja, merkst Du Dir für diese Endung das Symbol und musst bei nachfolgenden Dateien mit der Endung nicht mehr prüfen.

Findest Du in der Registry nix zu der Dateieindung, dann schaust Du in der Datei nach, ob sie ein Icon enthält. Wenn ja, nimmst Du das.

Jetzt musst Du nur noch herausfinden, welche Dateiendungen überhaupt zu Dateien gehören, die Icons enthalten könnten.

Da wären z. B. die Dateiendung .exe.

.lnk dürfte auf die verlinkte Datei und deren Symbol verweisen.

Bei .msc steht bei DefaultIcon z. B. %1.
Heißt, soweit ich weiß: Willst Du das Icon wissen, dann schaue bitte gefälligst in der Datei nach. ;-)

Beim Lesen von Verzeichnisstrukturen und dem Ermitteln von Icons zu Dateiendungen, musst Du halt pro Dateiendung einmal nachschauen. Steht in der Registry ein Hinweis auf das zu verwendende Icon, dann nimm es und merke es Dir. Für diese Dateiendung musst Du dann nichtmehr nachschauen.

Manchmal findet man auch bei DefaultIcon sowas: dxmasf.dll,-502
Dann muss man in die dort angegeben Datei schauen und da das Icon -502 (oder welche Zahl da auch stehen mag) auslesen.

Suchmaschinenergebnis(se):
https://msdn.microsoft.com/de-de/library/cc431255.aspx
https://entwickler-forum.de/showthre...nern-ermitteln
https://swissdelphicenter.ch/de/printcode.php?id=218
https://www.delphipraxis.net/195173-...ermitteln.html

MicMic 24. Aug 2018 18:40

AW: Windows - benutzerdefinierte Symbole zu Dateitypen
 
Danke für die reichlichen Infos
Hab mich inzwischen auch in der Registry umgeschaut. Kannte auch schon "DefaultIcon". Nutze dies auch bei anderen Dingen.

Technisch gesehen wär's möglich aber nicht der beste Weg. Hier und da müsste man ja dann auch weitere Schlüssel folgen, da nicht immer DefaultIcon vorhanden ist wo man es erwartet (steht auch in einem Link so). Da man das ganze sowieso zwischenspeichern würde, um nicht ständig aus der Registry neu zu lesen, mache ich jetzt gleich eine User-Einstellung daraus. Der Benutzer kann dann entscheiden, welche Dateiendungen spezielle Icon-Lade-Routinen zugewiesen werden. Also hier als Beispiel dann ".exe", ".msc", ".lnk", ".url". Da muss ich dann mal schauen, welche Dateiendungen noch zutreffen könnten. Alle anderen Dateiendungen bekommen das besagte verknüpfte Standard-Symbol... also hier einfach "SHGFI_USEFILEATTRIBUTES" für SHGetFileInfo.

Wünsch euch viel Spaß am Wochenende mit neuen kreativen Bits und Bytes :)

Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz