Desktop icons bekommen
-
Hallo zusammen,
ich muss irgendwie an die Anzahl und jeweiligen Verknüpfungen/Namen der Icons auf dem Desktop kommen. Kann mir jemand sagen, wo / wie ich das auslesen kann?
Gruß
Alex
-
Du kannst das Verzeichnis über die Registry bekommen:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop
Oder such einfach mal unter C:\Dokumente und Einstellungen\<Benutzername>\Desktop (zumindest unter XP). Unter Vista liegt es, glaube ich, in C:\Users\<...> .
EDIT: Verknüpfungen sind .lnk-Dateien (Link).
-
Hey,
die .lnk Dateien reichen leider nicht aus - es kann ja passieren, dass direkt Dateien auf dem Desktop liegen, und die sind dann keine .lnk
Es ist auch nicht ohne weiteres möglich aus den .lnk die Pfade zu den eigentlichen Dateien zu bekommen.
@Registry, ich habe mir den Schlüssel mal angesehen, der ist da, aber da ist nicht viel drunter gespeichert, oder mache ich was falsch?
Gruß
Alex
-
Egal ob lnk oder sonstige Dateien, die liegen alle im Desktop-Verzeichnis. Wirf einfach mal einen Blick hinein. Sobald du den Pfad hast, kannst du also auf alle Dateien zugreifen, die dort liegen.
In dem Schlüssel steht bei mir %USERPROFILE%\Desktop. Den Pfad von %USERPROFILE% kannst du auch in der Registry finden, ich weiß aber jetzt nicht, wo (Google is your friend!).
Wie du über eine lnk-Datei den Pfad bekommst, auf den die Verknüpfung zeigt, weiß ich nicht. Aber ich bin sicher, es gibt entsprechende WinAPI-Funktionen (MSDN is your friend!).
-
Das Verzeichnis des Desktops erhälst du über die SHGetSpecialFolderLocation, SHGetPathFromIDList Funktion. Wobei du den Pfad von allen Nutzer und dem Spezifischem Nutzer auslesen musst (CSIDL_COMMON_DESKTOPDIRECTORY, CSIDL_DESKTOPDIRECTORY)
Die Dateien auf dem Desktop erhälst du dann mit FindFirstFile, FindNext...
Das Ziel von Verknüpfungen (*.lnk) kannst du über das COM Objekt CLSID_ShellLink erfragen
-
Super, damit kann ich schon mal arbeiten!
Danke!
-
Für die Suche, eine funktionierende (fast) Lösung:
CHAR path[MAX_PATH]; CHAR path2[MAX_PATH]; GetSpecialPath(CSIDL_COMMON_DESKTOPDIRECTORY, path); GetSpecialPath(CSIDL_DESKTOPDIRECTORY, path2); HANDLE fHandle; WIN32_FIND_DATA wfd; fHandle=FindFirstFile(path2, &wfd); do { // Eintrag nur behandeln, wenn es nicht . oder .. ist (werden nur bei Unterverzeichnissen mit zurückgeliefert) // hier könnte man z.B. auch mit lstrcmp auf . und .. vergleichen, was allerdings nicht ganz so effizient ist if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { MessageBox(0,wfd.cFileName,"Folgendes Verzeichnis wurde gefunden:",0); // Datei ist keine, sondern ein Verzeichnis... // Hier könnte man dasselbe nochmal machen, um auch die // Unterverzeichnisse zu scannen ;-) } else MessageBox(0,wfd.cFileName,"Folgende Datei gefunden:",0); } } while (FindNextFile(fHandle,&wfd)); FindClose(fHandle); cout << "Common Pfad: " << path <<"\n"; cout << "User Pfad: " << path2;das kleine Problem, was ich noch habe, ist dass
GetSpecialPath(CSIDL_DESKTOPDIRECTORY, path2);einen Verzeichnissnamen wie zB "c:\windows" liefert, FindFirstFile(path2, &wfd); erwartet aber einen Pfadnamen wie zB "c:\\windows\" also mit jeweils Doppelslash. Muss ich den String manuell umschreiben, oder gibt es eine einfachere Lösung?
Alex
-
Das ist Quatsch, Doppelte Slashes brauchst du nie weil \\ zu \ entwertet wird wie bei \r \n, Wenn es erstmal im SPeicher steht brauchst du keine doppelten Slashes..
-
Doch, teste den Codeschnippsel mal. Du wirst sehen, dass es so, wie es da steht nicht funktionieren wird.
Setzt du aber in der Zeile 10 statt path2
"C:\\WINDOWS\*" dann klappt es.Alex
-
Alex__ schrieb:
Doch, teste den Codeschnippsel mal. Du wirst sehen, dass es so, wie es da steht nicht funktionieren wird.
Setzt du aber in der Zeile 10 statt path2
"C:\\WINDOWS\*" dann klappt es.Alex
Nein, du kannst DaRpH ruhig glauben. Wenn du im Quellcode C:\\Windows\\ schreibst, dann steht im Speicher C:\Windows\. Das ist einfach eine Tatsache. Escapesequenzen sind ja einfach ein Hilfsmittel, um dir das Entwickeln zu erleichtern. Wenn du "\n" im Quellcode in einen String schreibst, dann steht da ja auch nicht wirklich "\n", sondern es wird an diese Stelle ein ASCII 10 gesetzt.
\r wird im Speicher zu ASCII 13
\n wird im Speicehr zu ASCII 10
\\ wird im Speicher zu '\'
\\\ wird im Speicher zu '\' (z.B. für Netzwerkpfade)
-
Ach stimmt.
Das Problem war, dass man an den von GetSpecialPath gelieferten CHAR noch ein "\*" anhängen musste.Grüße
Alex
-
Hallo Ist zwar schon ein älterer Post.
Aber ich habe jedoch hier eine einfachere Methode gefunden.
Mit API-Zugriffen.http://rrworld.mybb3.org/viewtopic.php?f=9&t=98
Ich denke dies ist einfacher als die verschiedenen Ordner auszulesen.
-
Kreilon schrieb:
Hallo Ist zwar schon ein älterer Post.
Aber ich habe jedoch hier eine einfachere Methode gefunden.
Mit API-Zugriffen.http://rrworld.mybb3.org/viewtopic.php?f=9&t=98
Ich denke dies ist einfacher als die verschiedenen Ordner auszulesen.
Edit:
Sorry, war für den Borland C++ Builder
(Kann gelöscht werden)