AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wallpaper und Windows 8+

Ein Thema von KodeZwerg · begonnen am 11. Okt 2018 · letzter Beitrag vom 14. Okt 2018
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Wallpaper und Windows 8+

  Alt 12. Okt 2018, 10:05
hallo HolgerX!

also nachschauen was das ziel ist kann ich nicht, da es ein fremdrechner ist.
was ich wiederum sagen kann, die windows api gibt nur ein verzeichnis wieder wo hingegen das script sowie auch meine delphi umsetzung davon einen pfad+dateinamen ausspuckt.
der code ist noch nicht ganz fertig, man sieht ja das es ne baustelle ist
was noch fehlt ist multi monitor support, wenn man zwei oder mehr hat und verschiedene wallpaper je monitor einsetzt, dann landet das alles auch in dem binären eintrag, da weiß ich gerade noch nicht wie windows das dann speichert.
für single wallpaper ist der code oben okay.
für ein generelles usage sollte man eine windows os versions abfrage mit einbauen, alles vor windows 8 mit der api aufrufen alles ab windows 8 sollte mein code nun vernünftig umsetzen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
981 Beiträge
 
Delphi 6 Professional
 
#2

AW: Wallpaper und Windows 8+

  Alt 12. Okt 2018, 17:17
Hmm..

Hab hier nen Win8.1 Notebbook und einfach mal in \AppData\Roaming\Microsoft\Windows\Themes\ reingeschaut, wenn ich ein Hintergrundbild unter Windows auswähle.

Dort wurde die Datei TranscodedWallpaper seitens Windows ausgetauscht. Es handelt sich dabei um ein JPG.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wallpaper und Windows 8+

  Alt 12. Okt 2018, 17:52
ja du hattest vollkommen recht @holgerx, es ist eine datei, da ich die infos nur per mail erhalten hatte, kam es als ein verzeichnis name rüber wegen fehlender endung.
meine obige funktion gibt jedenfalls den originalen dateinamen wieder aus dem diese TranscodedWallpaper datei entstand.
also beides hat seine richtigkeit irgendwie
die api lügt ja nicht, von daher korrigiere ich meine aussage, nur das eigentliche ziel/original das ist daraus nicht ersichtlich.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
981 Beiträge
 
Delphi 6 Professional
 
#4

AW: Wallpaper und Windows 8+

  Alt 13. Okt 2018, 09:17
Hmm..

Ich habe mir mal erlaubt, deine Routine zu korrigieren:

Delphi-Quellcode:
function GetWallpaperCache:WideString;
const
  CDataValue: string = 'TranscodedImageCache';
  CKeyName: string = 'Control Panel\Desktop\';
var
  regist: TRegistry;
  KeyExists: boolean;
  vSize : integer;
  arr: array of WideChar;
begin
  Result := '';
  regist := TRegistry.Create;
  try
    regist.RootKey := HKEY_CURRENT_USER;
    try
      KeyExists := regist.OpenKey(CKeyName, false);
      if (KeyExists) then
      begin
        vSize := regist.GetDataSize(CDataValue);
        if (vSize > 0) then
        begin
          SetLength(arr, vSize div 2);
          regist.ReadBinaryData(CDataValue, arr[0], vSize);
          Result := PWideChar(@Arr[12]);
        end;
      end;
    except
      regist.CloseKey;
    end
  finally
    regist.Free;
  end;
end;
Die ReadBinaryData enthalten offensichtlich ab dem Byte 24 einen WideString.
Dann sollte man diesen auch als dass verwenden, damit wir auch Unicode-Dateinamen erhalten

Hierbei scheint es sich eventuell um eine Bilderserie handeln zu können, da es noch den Registry-Eintrag 'TranscodedImageCount' gibt.
Konnte es jedoch noch nicht testen.

Ist wohl dann für SlideShows...
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Wallpaper und Windows 8+

  Alt 13. Okt 2018, 11:14
Ist wohl dann für SlideShows...
Meine Vermutung wäre, das wenn man multi monitor hat mit verschiedenen wallpapers gesetzt das die dann alle da drinnen gespeichert werden und mit binär wert #00#00 getrennt werden.
Aber Slideshow wäre natürlich auch denkbar.
Mist das ich im Netz keine Information von Microsoft darüber finde.
Naja, test'n'try
PWide.... SUPER!!!! Den Vorschlag nehme ich dankend an/übernehme ich so
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
981 Beiträge
 
Delphi 6 Professional
 
#6

AW: Wallpaper und Windows 8+

  Alt 13. Okt 2018, 15:16
Hmm..

Angelehnt an
https://github.com/kujason/FindWallp...dWallpaper.vbs

scheint bei nur einem Monitor das Bild in 'TranscodedImageCache' abgespeichert zu sein.

Bei meheren Monitoren wird ein '_XXX' als Index an TranscodedImageCache angehängt (z.B. TranscodedImageCache_000 für Monitor idx 0)
Dort steht in den BIN Daten dann zusätzlich hinter dem Bildnamen noch (meiner Meinung nach) die Device ID des Monitores.

----- Debuggerauszug des WideChar Array -------------------
('?', #1, '?', #8, '?', '', '?', '', '?', '?', '?', 'a', 'C', ':', '\', 'W', 'i', 'n', 'd', 'o', 'w', 's', '\', 'W', 'e', 'b', '\', 'W', 'a', 'l', 'l', 'p', 'a', 'p', 'e', 'r', '\', 'W', 'i', 'n', 'd', 'o', 'w', 's', '\', 'i', 'm', 'g', '0', '.', 'j', 'p', 'g', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\', '\', '?', '\', 'D', 'I', 'S', 'P', 'L', 'A', 'Y', '#', 'L', 'G', 'D', '0', '4', '6', 'C', '#', '5', '&', '2', '5', 'a', 'f', 'c', 'a', '1', '8', '&', '0', '&', 'U', 'I', 'D', '1', '0', '9', '0', '6', '0', '8', '#', '{', 'e', '6', 'f', '0', '7', 'b', '5', 'f', '-', 'e', 'e', '9', '7', '-', '4', 'a', '9', '0', '-', 'b', '0', '7', '6', '-', '3', '3', 'f', '5', '7', 'b', 'f', '4', 'e', 'a', 'a', '7', '}', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '')


Ach, noch ein Hinweis:
In TranscodedImageCache steht immer das 'letzte' Bild, welches verwendet wurde.
Wird der Hintergrund duch z.B. einfarbigen Hintergrund ersetzt, bleibt der Name in TranscodedImageCache stehen.

Deshalb erst SystemParametersInfo(SPI_GETDESKWALLPAPER.. und wenn dort '..\TranscodedWallpaper' drinnen steht, dann den Originalnamen über TranscodedImageCache auslesen
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Wallpaper und Windows 8+

  Alt 13. Okt 2018, 17:58
so habe ich es nun. in der hoffnung das alles korrekt ist widme ich mich nun tests.
Delphi-Quellcode:
function GetTranscodedImageCache: WideString;
const
  CDataValue: string = 'TranscodedImageCache';
  CKeyName: string = 'Control Panel\Desktop\';
var
  regist: TRegistry;
  KeyExists: Boolean;
  vSize, i: Integer;
  tmpStr: WideString;
begin
  Result := '';
  regist := TRegistry.Create(KEY_READ);
  try
    regist.RootKey := HKEY_CURRENT_USER;
    try
      KeyExists := regist.OpenKey(CKeyName, false);
      if (KeyExists) then
      begin
        regist.Access := KEY_READ;
        vSize := regist.GetDataSize(CDataValue);
        if (vSize > 0) then
        begin
          tmpStr := '';
          SetLength(tmpStr, vSize div 2);
          regist.ReadBinaryData(CDataValue, tmpStr[1], vSize);
          Delete(tmpStr,1,12);
          for i := 1 to length(tmpStr)-1 do
            if ( (tmpStr[i]=Char(#0)) and (tmpStr[i+1]=Char(#0)) ) then
             begin
               Delete(tmpStr, i, Length(tmpStr));
               Break;
             end;
          Result := tmpStr;
        end;
        regist.CloseKey;
      end;
    except
      regist.CloseKey;
    end
  finally
    regist.Free;
  end;
end;

function GetWallpaperBitmap: String;
const
  SPI_GETDESKWALLPAPER = $0073;
var
  wpFName: array [0..MAX_PATH] of Char;
begin
  if SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, @wpFName, 0)
    then Result := String(wpFName)
    else Result := '';
end;

function GetWallpaperFilename: String;
var
  tmpStr: String;
begin
  tmpStr := GetWallpaperBitmap;
  if Pos('TranscodedWallpaper',tmpStr) > 0 then
  Result := GetTranscodedImageCache
  else Result := tmpStr;
end;
Gruß vom KodeZwerg

Geändert von KodeZwerg (14. Okt 2018 um 10:53 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:00 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