2017-11-25 5 views
2

Ich möchte das ursprüngliche PNG/BMP (32 Bit mit Alpha) des Themateils mit einem bestimmten Status unter Verwendung der GetThemeStream Funktion speichern.
Es funktioniert gut für Teile wie hier beschrieben: GetThemeStream usageWie kann ich Windows Theme Part mit GetThemeStream speichern? (außer DWMWINDOW)

Aber ich bin nicht in der Lage andere andere Thementeile zu bekommen, als .
Die OpenThemeData(0, 'BUTTON') ist in Ordnung, aber der Aufruf von GetThemeStream fehlschlägt:

Es gibt immer HResult -2147023728 ($80070490): Element nicht gefunden.

function SaveTheme(const APathToSave: string): Boolean; 
const 
    ThemeRegPath = 'SOFTWARE\Microsoft\Windows\CurrentVersion\ThemeManager'; 
var 
    hTh: HTHEME; 
    hLib: HMODULE; 
    DllName, Path: string; 
    MS: TMemoryStream; 
    BufSize: Cardinal; 
    PBuf: Pointer; 
    hr: HResult; 
begin 
    Result := False; 
    { hTh := OpenThemeData(0, 'DWMWINDOW'); } // <- this works OK 
    hTh := OpenThemeData(0, 'BUTTON'); 
    if hTh <> 0 then 
    try 
    // Get Library path 
    SetLength(DllName, 1024); 
    SHRegGetPath(HKEY_CURRENT_USER, PChar(ThemeRegPath), 'DllName', PChar(DllName), 0); 
    // Open Library 
    hLib := LoadLibraryEx(PChar(DllName), 0, LOAD_LIBRARY_AS_DATAFILE); 
    if hLib > 0 then 
    try 
     hr := GetThemeStream(hTh, BP_PUSHBUTTON, PBS_NORMAL, TMT_DISKSTREAM, PBuf, BufSize, hLib); 
     if hr = S_OK then begin 
     MS := TMemoryStream.Create; 
     try 
      MS.WriteBuffer(PByteArray(PBuf)^[0], BufSize); 
      MS.Position := 0; 
      MS.SaveToFile(APathToSave); 
      Result := True; 
     finally 
      MS.Free; 
     end; 
     end; 
    finally 
     FreeLibrary(hLib); 
    end; 
    finally 
    CloseThemeData(hTh); 
    end; 
end; 

F: Wie kann ich einen BUTTON (BP_PUSHBUTTON) Teil mit einem Zustand der PBS_NORMAL in eine PNG speichern GetThemeStream verwenden?

Die Dokumentation ist sehr schlecht und es gibt einige Beispiele im Internet. Ich habe mich sehr bemüht, einige Hinweise zur Verwendung dieser Funktionen zu finden, konnte aber nichts Nützliches finden.

+3

'GetThemeStream()' 'nicht nicht verwendet GetLastError()', um Fehler zu melden. Es gibt ein 'HRESULT' zurück, welches der tatsächliche Fehlercode ist, wobei 0 Erfolg bedeutet. Welchen Wert gibt es tatsächlich zurück, wenn kein Stream bereitgestellt wird? –

+0

@RemyLebeau, es gibt immer zurück -2147023728 ($ 80070490) - Element nicht gefunden. Ich habe einen Schnitt gemacht. – zig

+1

dann gibt es nichts, was Sie tun können. Der gewünschte Stream existiert nicht –

Antwort

1

Nach ein bisschen mehr Graben, denke ich @RemyLebeau hatte Recht und ich kann nichts mit GetThemeStream tun. speziell da die Dokumentation ein Witz ist.

Das einzige, was "funktioniert" ist GetThemeBitmap. Das ist auch ein Geheimnis für sich. es ignoriert den Teil Zustand und die Ausgabe-Bitmap enthält alle verfügbaren Zustände.

enter image description here

Siehe auch: How to get an icon associated with Windows theme?

Verwandte Themen