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
HolgerX

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

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
 
#2

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
HolgerX

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

AW: Wallpaper und Windows 8+

  Alt 14. Okt 2018, 13:24
Hmm..

Hab mal noch nen bisschen recherchiert:

Ab Windows 8 gibt es IDesktopWallpaper, damit ist es möglich, nicht nur 'das' Wallpaper-File auszulesen, sondern je Monitor.

Anbei ein Testprogram.

Habe mir hierfür die benötigten Deklarationen zusammen geschrieben, so das nicht die ganze Win32 API für ShObjIdl eingebunden werden muss.

Zusätzlich habe ich deine Funktion für die Registry noch mal 'verschönert'


(Quelle WindowsAPI : https://github.com/CMCHTPC/WindowsAPI )

(Das Testtool ist mit Delphi 6 erstellt und auf Windows 8.1 getestet worden)
Angehängte Dateien
Dateityp: zip Test_Hintergrundbild.zip (236,5 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Wallpaper und Windows 8+

  Alt 14. Okt 2018, 14:17
ich bin baff!! super leistung holger, wie du nun den cache ausliest, als teil eines records, das finde ich echt genial!!!
plus dazu noch einen völlig neue methode mal so reingezaubert, echt toll recherchiert und bestens umgesetzt.
ich bin mehr als begeistert!!!
habe es noch nicht versucht selbst zu kompilieren, deine .exe zeigts mir ja bestens an =)

wobei beim lesen mir eine sache auffällt.
Delphi-Quellcode:
procedure TForm1.ButtonRegClick(Sender: TObject);
var
  s : string;
begin
  s := GetWallpaperName;

  if Pos('',s) > 0 then // <<<--- gehört da nicht TranscodedWallpaper noch rein? also
  if (Pos('transcodedwallpaper',LowerCase(s)) > 0) then

    Edit1.Text := GetWallpaperCache
  else
    Edit1.Text := s;
end;
edit
also um das was ich wollte zu erreichen muss diese änderung rein.
sonst kommt als Registry ergebnis ...\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper mit änderung erhalte ich wieder das gewünschte, IDesktopWallpaper funktioniert bestens, sowie als auch.
Gruß vom KodeZwerg

Geändert von KodeZwerg (14. Okt 2018 um 14:59 Uhr)
  Mit Zitat antworten Zitat
HolgerX

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

AW: Wallpaper und Windows 8+

  Alt 14. Okt 2018, 17:29
Delphi-Quellcode:
procedure TForm1.ButtonRegClick(Sender: TObject);
var
  s : string;
begin
  s := GetWallpaperName;

  if Pos('',s) > 0 then // <<<--- gehört da nicht TranscodedWallpaper noch rein? also
  if (Pos('transcodedwallpaper',LowerCase(s)) > 0) then

    Edit1.Text := GetWallpaperCache
  else
    Edit1.Text := s;
end;
Hast recht, ist leider ein Flüchtigkeitsfehler, da ich parallel nach IDesktopWallpaper am Suchen war
  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 04:35 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