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.
'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? –
@RemyLebeau, es gibt immer zurück -2147023728 ($ 80070490) - Element nicht gefunden. Ich habe einen Schnitt gemacht. – zig
dann gibt es nichts, was Sie tun können. Der gewünschte Stream existiert nicht –