Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Speziellen Pfad in XP finden (https://www.delphipraxis.net/27184-speziellen-pfad-xp-finden.html)

axelf98 5. Aug 2004 14:45


Speziellen Pfad in XP finden
 
Hallo!

Wie kann ich bei einem XP-System folgenden Pfad des aktuellen Benutzers finden?

'C:\Dokumente und Einstellungen\adminnisrator\Lokale Einstellungen\Anwendungsdaten\Microsoft\Wallpaper1 .bmp'

(In diesem Fall heisst der Benutzer "adminnisrator")

Luckie 5. Aug 2004 14:59

Re: Speziellen Pfad in XP finden
 
Such mal im Forum oder im MSDN nach SHGetSpecialFolderLocation. Das sollte dir helfen.

mirage228 5. Aug 2004 15:01

Re: Speziellen Pfad in XP finden
 
Zitat:

Zitat von Luckie
Such mal im Forum oder im MSDN nach SHGetSpecialFolderLocation. Das sollte dir helfen.

Hi,

und der Ordner, den du suchst, dürfte CSIDL_LOCAL_APPDATA sein. ;)

Siehe: http://msdn.microsoft.com/library/de...nums/csidl.asp

mfG
mirage228

CalganX 5. Aug 2004 15:08

Re: Speziellen Pfad in XP finden
 
Hi,
warum denn erstmal ins MSDN schicken, wenn [cl="Special Folder*"]wir auch sowas haben[/cl]. ;)

Chris

axelf98 5. Aug 2004 15:24

Re: Speziellen Pfad in XP finden
 
Danke an alle :)

Aber der Link von Chakotay1308 scheint mir ein wenig "Overkill" zu sein...
Ich schreibe ein Miniprogramm für einen einzigen Rechner, das bei jedem Start die Hintergrundbilder wechselt...

Luckie 5. Aug 2004 15:25

Re: Speziellen Pfad in XP finden
 
Zitat:

Zitat von Luckie
Such mal im Forum oder im MSDN

Wer lesen kann... da ich aber kein kombiniertes DP-MSDN-Suchtag zur Hand hatte, habe ich es eben nur fett gemacht.

Was bitte sehr ist an den 23 Zeilen "overkill"? :gruebel:

axelf98 5. Aug 2004 15:41

Re: Speziellen Pfad in XP finden
 
Ich habs jetzt folgendermaßen gelöst: (Einfache Version)
Delphi-Quellcode:
function GetUser: string;
const
  UNLEN = 256; // Maximum user name length (LmCons.h)
var
  Size: DWORD;
begin
  Size := UNLEN + 1;
  SetLength(Result, Size);
  if GetUserName(PChar(Result), Size) then
    begin
     SetLength(Result, Size);
     Result := String(Pchar(Result)); // <- Sonst Fehler...
    end
  else
    Result := '';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
...
 Datei := 'C:\Dokumente und Einstellungen\'+GetUser+'\Lokale Einstellungen\Anwendungsdaten\Microsoft\Wallpaper1.bmp';
...
end;
Nur hatte ich das Problem, dass ich ohne die zusätzliche Zeile in GetUser nichts mehr an den String anhängen konnte. Gelöst habe ich das Problem mit der //Sonst Fehler Zeile, es geht aber auch mit Trim(GetUser)... Was davon ist sinnvoller?

Luckie 5. Aug 2004 15:46

Re: Speziellen Pfad in XP finden
 
Das mag bei dir funktionieren, was aber wenn
- ein Benutzer im System den Pfad umgebogen hat?
- es kein deutschsprachiges Windows ist?
- bei ihm der Order nicht "Dokumente und Einstellungen", sondern sonst wie heißt?

Da wäre es fast noch sicherer es aus der Registry auszulesen, aber davon würde ich abraten, falls Microsodt mal auf die Idee kommt es wo anders abzulegen. Der einzig sinnvolle und sichere Weg, übrigens auch von MS empfohlen ist über die obige API Funktion.

CalganX 5. Aug 2004 15:47

Re: Speziellen Pfad in XP finden
 
Hi,
schön und was ist jetzt, wenn ich ein englisches Windows habe? ;)
Der Quelltext, den ich dir dort gegeben habe, besteht nur aus 23 Zeilen. d3g hat lediglich Hintergrundinformationen dazu gegeben. Ganz unten siehst du den Source und wie du ihn aufrufen kannst, wenn dir der Hintergrund nicht so wichtig ist.

Chris

axelf98 5. Aug 2004 15:54

Re: Speziellen Pfad in XP finden
 
Ja ist ja schon gut.. Damit ich auch in den Programmierhimmel komme und keine API-Sünden begehe, werd ich die 23 Zeilen Code einfügen :angel2:

MathiasSimmack 5. Aug 2004 15:59

Re: Speziellen Pfad in XP finden
 
Es sind max. 6 Zeilen Mehr-Aufwand. ;)

Luckie 5. Aug 2004 16:00

Re: Speziellen Pfad in XP finden
 
Mir ist es egal, was du machst, ich habe dich nur auf mögliche Probleme mit deinem Code hingewiesen.

MathiasSimmack 5. Aug 2004 16:08

Re: Speziellen Pfad in XP finden
 
Und das zurecht, Luckie!

Aber mir fällt gerade ein, dass es doch in der Open Source-Sparte ein ähnliches Programm gibt, dem es im Prinzip vollkommen egal ist, wo sich das Hintergrundbild befindet. Sprich: Mit den Pfaden brauchst du dich überhaupt nicht rumärgern. Hier ist der Originalbeitrag, hier eine Alternative samt Update. Reicht das nicht auch schon?

axelf98 5. Aug 2004 16:14

Re: Speziellen Pfad in XP finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von MathiasSimmack
Aber mir fällt gerade ein, dass es doch in der Open Source-Sparte ein ähnliches Programm gibt, dem es im Prinzip vollkommen egal ist, wo sich das Hintergrundbild befindet. Sprich: Mit den Pfaden brauchst du dich überhaupt nicht rumärgern.

Ich habs mit allen in der DP verfügbaren Funktion probiert, aber keine lief bei mir, ausser man kopiert die als Bitmap konvertierte JPEG in dieses Verzichnis.

Im Anhang habe ich mein Programm, das aus dem Ordner in dem es sich befindet alle Jpgs sucht, durch Zufall eine Datei auswählt und als Hintergrund einstellt. Das Programm funktioniert wahrscheinlich nur unter WIN XP und WIN 2000, braucht dafür aber keine 8-Tasten Maus. 8)

MathiasSimmack 5. Aug 2004 16:17

Re: Speziellen Pfad in XP finden
 
Was glaubst du, was das Programm im genannten Link macht? Es sucht ebenfalls alle Bitmaps (sofern ActiceDesktop unter 9x aktiv ist auch alle JPEGs) und lädt eine. Ich persönlich habe es unter 98 und XP getestet. Meine Version, natürlich. :) Keine Probleme.

axelf98 5. Aug 2004 16:19

Re: Speziellen Pfad in XP finden
 
Ich wollte das Erlebnis haben dieses Problem selbst zu lösen

Luckie 5. Aug 2004 16:27

Re: Speziellen Pfad in XP finden
 
Hast du ja auch. Nur eben nicht perfekt und Fehler anfällig.

axelf98 5. Aug 2004 16:32

Re: Speziellen Pfad in XP finden
 
Zitat:

Zitat von Luckie
Hast du ja auch. Nur eben nicht perfekt und Fehler anfällig.

Schau dir mal den Code an.. Ich habs doch eingebaut und dürfte nicht mehr fehlerhaft sein!

Delphi-Quellcode:
program WechselHintergrund;

uses Windows,Sysutils,Graphics,Classes,Registry,JPEG,ActiveX,ShellAPI,ShlObj;

var
 Liste : Tstringlist;
 Zufall : Integer;
 bmp: TBitmap;
 mjpeg: TJpegImage;
 Datei: String;

Function ChangeWallpaper(FileName: String; Style: Integer): Boolean;
Var
  reg: TRegistry;
  wp: Array[0..$FF] Of Char;
Begin
  reg := TRegistry.Create;
  Try
    reg.RootKey := HKEY_CURRENT_USER;
    If reg.OpenKey('\Control Panel\desktop\', True) Then
    Begin
      If (Style = 1) Then
        reg.WriteString('TileWallpaper', '1')
      Else
        reg.WriteString('TileWallpaper', '0');
      reg.WriteString('WallpaperStyle', IntToStr(Style));
    End;
  Finally
    reg.Free;
  End;
  StrPCopy(wp, FileName);
  Result := SystemParametersInfo(spi_SetDeskWallpaper, 0, @wp, spif_UpdateIniFile);
End;

function GetAllFiles(mask: string): TStringlist;
{....}
end;

function GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var
  pMalloc: IMalloc;
  pidl: PItemIDList;
  Path: PChar;
begin
  // get IMalloc interface pointer
  if (SHGetMalloc(pMalloc) <> S_OK) then begin
    MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
               'SHGetMalloc(pMalloc)', 16);
    Exit;
  end;

  // retrieve path
  SHGetSpecialFolderLocation(hWindow, Folder, pidl);
  GetMem(Path, MAX_PATH);
  SHGetPathFromIDList(pidl, Path);
  Result := Path;
  FreeMem(Path);

  // free memory allocated by SHGetSpecialFolderLocation
  pMalloc.Free(pidl);
end;
        //------------------------------------------------------------
  begin
 randomize;
 Liste := Tstringlist.create;
 Liste := GetAllFiles(Extractfilepath(ParamStr(0))+'*.jpg');
 if Liste.count = 0 then
   halt;

 Zufall := random(Liste.count);
 if fileexists(Liste[Zufall]) then
 begin
 try
  mjpeg := TJpegImage.Create;
  mjpeg.LoadFromFile(Liste[Zufall]);
  bmp:=TBitmap.Create;
  bmp.Assign(mjpeg);
  Datei := GetSpecialFolder(0,28) + '\Microsoft\Wallpaper1.bmp';
  bmp.SaveToFile(Datei);
  ChangeWallpaper(Datei,2);
  Liste.Free;
 except
  end;
 end;

end.

MathiasSimmack 6. Aug 2004 07:09

Re: Speziellen Pfad in XP finden
 
Zitat:

Zitat von axelf98
Ich wollte das Erlebnis haben dieses Problem selbst zu lösen

Das ist sehr lobenswert. Wirklich! :thumb: Nur wollte ich dir zeigen, dass du diesen Pfad nicht brauchst, mit dem du da hantierst. Und nur darum ging es. Niemand hat von dir verlangt, dass du dein Projekt einstellst und nun meins nimmst.

Zu deinem letzten Code-Posting würde ich sagen, benutze bitte nicht den Wert "28" für den Ordner. Kein Mensch, außer dir (weil du ihn gerade brauchst), weiß aus dem Kopf, was er bedeutet. Wofür gibt es denn die Konstanten wie CSIDL_APPDATA, usw.?
Das ist, mit Verlaub, der gleiche Unsinn, den ich bei Dialogboxen immer sehe. Anstelle der IMHO selbst erklärenden Konstanten wie
Delphi-Quellcode:
MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON2
werden die Werte zusammengerechnet, und zwei Monate später weiß man (ohne Ausprobieren des Programms) nicht mehr, was es bedeutet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 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