![]() |
Startmenü Einträge
Hallo miteinander!
Ich versuche, im OnCreate Ereignis meines Programmes den Ordner "C:\Dokumente und Einstellungen\All Users\Startmenü\" auszulesen und in einer ListView anzuzeigen...klappt aber nicht so recht... Danach möchte ich z.B. einen Ordner unter "C:\...\Startmenü" erstellen und Dateien in diesen Ordner hineinsetzen, die der Benutzer ausgewählt hat... Jetzt meine Frage: Wie stelle ich das ungefähr an? :gruebel: Mfg Philipp |
Re: Startmenü Einträge
Es gibt in HKCU einen Eintrag, welcher besagt wo das Startmenue gespeichert ist. Diese Eintraege liegen in HKCU\Software\Microsoft\Windows\CurrentVersion\Exp lorer\User Shell Folders. Einfach mal reingucken ;)
Greetz alcaeus |
Re: Startmenü Einträge
Genau. Du liest diesen Key einfach ein (in der Delphi-Hilfe (zumindest bis V7) ist sogar ein ausführliches Beispiel und scannst dann das Dir. Dazu gibts auch massig Funktionen:
Delphi-Quellcode:
procedure getdirsindir(const verzeichniss:string;var dirs:tstringlist);
var sd:string; s:tsearchrec; i:integer; begin dirs:=tstringlist.Create; sd:=dirup(verzeichniss); if findfirst(sd+'*.*',faanyfile,s)<>0 then begin sysutils.findclose(s); exit; end; dirs.add(s.Name); while findnext(s)=0 do dirs.Add(s.name); i:=0; while i<dirs.count do begin if ((dirs[i]='..') or (dirs[i]='.')) then begin dirs.Delete(i); i:=i-1; end else if not directoryexists(sd+dirs[i]) then begin dirs.Delete(i); i:=i-1; end; inc(i); end; sysutils.findclose(s); end; function getfilesindir(const verzeichniss,filter:string;var files:tstringlist):extended; var sd:string; s:tsearchrec; i:integer; e:extended; flt:string; begin if filter='' then flt:='*.*' else flt:=filter; e:=0; sd:=dirup(verzeichniss); result:=0; files:=tstringlist.Create; if findfirst(sd+flt,faanyfile,s)<>0 then begin sysutils.findclose(s); exit; end; files.add(s.Name); while findnext(s)=0 do begin files.Add(s.name); e:=e+s.Size; end; i:=0; while i<files.count do begin if ((files[i]='..') or (files[i]='.')) then begin files.Delete(i); i:=i-1; end else if directoryexists(sd+files[i]) then begin files.Delete(i); i:=i-1; end; inc(i); end; result:=e; sysutils.findclose(s); end; function gettreeindir(const root:string;var files,dirs:tstringlist;filter:string):extended; var sd:string; i,j:integer; fls,unterverzeichnisse:tstringlist; flt:string; groesse:extended; begin groesse:=0; if filter='' then flt:='*.*' else flt:=filter; sd:=dirup(root); files:=tstringlist.Create; dirs:=tstringlist.Create; dirs.Add(sd); i:=0; while i<dirs.Count do begin getdirsindir(dirs[i],unterverzeichnisse); for j:=0 to unterverzeichnisse.Count-1 do dirs.Add(dirup(dirs[i])+unterverzeichnisse.Strings[j]); inc(i); end; for i:=0 to dirs.Count-1 do begin groesse:=groesse+getfilesindir(dirs[i],flt,fls); for j:=0 to fls.Count-1 do files.Add(dirup(dirs[i])+fls.strings[j]); end; result:=groesse; end; |
Re: Startmenü Einträge
Ich würde nicht darauf vertrauen, dass der Registry Eintrag immer dort ist und auch immer Gültigkeit hat. Ich würde da besser die API Funktion nehmen:
Delphi-Quellcode:
const
CSIDL_FLAG_CREATE = $8000; CSIDL_ADMINTOOLS = $0030; CSIDL_ALTSTARTUP = $001D; CSIDL_APPDATA = $001A; CSIDL_BITBUCKET = $000A; CSIDL_CDBURN_AREA = $003B; CSIDL_COMMON_ADMINTOOLS = $002F; CSIDL_COMMON_ALTSTARTUP = $001E; CSIDL_COMMON_APPDATA = $0023; CSIDL_COMMON_DESKTOPDIRECTORY = $0019; CSIDL_COMMON_DOCUMENTS = $002E; CSIDL_COMMON_FAVORITES = $001F; CSIDL_COMMON_MUSIC = $0035; CSIDL_COMMON_PICTURES = $0036; CSIDL_COMMON_PROGRAMS = $0017; CSIDL_COMMON_STARTMENU = $0016; CSIDL_COMMON_STARTUP = $0018; CSIDL_COMMON_TEMPLATES = $002D; CSIDL_COMMON_VIDEO = $0037; CSIDL_CONTROLS = $0003; CSIDL_COOKIES = $0021; CSIDL_DESKTOP = $0000; CSIDL_DESKTOPDIRECTORY = $0010; CSIDL_DRIVES = $0011; CSIDL_FAVORITES = $0006; CSIDL_FONTS = $0014; CSIDL_HISTORY = $0022; CSIDL_INTERNET = $0001; CSIDL_INTERNET_CACHE = $0020; CSIDL_LOCAL_APPDATA = $001C; CSIDL_MYDOCUMENTS = $000C; CSIDL_MYMUSIC = $000D; CSIDL_MYPICTURES = $0027; CSIDL_MYVIDEO = $000E; CSIDL_NETHOOD = $0013; CSIDL_NETWORK = $0012; CSIDL_PERSONAL = $0005; CSIDL_PRINTERS = $0004; CSIDL_PRINTHOOD = $001B; CSIDL_PROFILE = $0028; CSIDL_PROFILES = $003E; CSIDL_PROGRAM_FILES = $0026; CSIDL_PROGRAM_FILES_COMMON = $002B; CSIDL_PROGRAMS = $0002; CSIDL_RECENT = $0008; CSIDL_SENDTO = $0009; CSIDL_STARTMENU = $000B; CSIDL_STARTUP = $0007; CSIDL_SYSTEM = $0025; CSIDL_TEMPLATES = $0015; CSIDL_WINDOWS = $0024; //////////////////////////////////////////////////////////////////////////////// // GetShellFolder // Returns the special shell folders // uses: ActiveX, ShlObj; function GetShellFolder(CSIDL: integer): string; var pidl : PItemIdList; FolderPath : string; SystemFolder : Integer; Malloc : IMalloc; begin Malloc := nil; FolderPath := ''; SHGetMalloc(Malloc); if Malloc = nil then begin Result := FolderPath; Exit; end; try SystemFolder := CSIDL; if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then begin SetLength(FolderPath, max_path); if SHGetPathFromIDList(pidl, PChar(FolderPath)) then begin SetLength(FolderPath, length(PChar(FolderPath))); end; end; Result := FolderPath; finally Malloc.Free(pidl); end; end; |
Re: Startmenü Einträge
Ok, ich habe es jetzt mit der API funktion von luckie gemacht...
Jetzt ist noch, wie kann ich darin Dateien in diesen Ordner hineinsetzen, die der Benutzer ausgewählt hat... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz