我想保存原始PNG/BMP使用GetThemeStream
功能的特定状态下的主题部分的(32位具有α)。
它非常适用部分如下所述:GetThemeStream usage如何使用GetThemeStream保存Windows主题部分? (比DWMWINDOW其他)
但我无法得到比其他其他主题部分。
的OpenThemeData(0, 'BUTTON')
是确定的,但调用GetThemeStream
失败:
它总是返回的HResult -2147023728
($80070490
):找不到元素。
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;
问:我如何可以节省BUTTON
(BP_PUSHBUTTON
)部分与PBS_NORMAL
的状态到使用GetThemeStream
一个PNG?
文档非常差,网上有任何例子。我努力找到一些关于如何使用这些函数的线索,但是我找不到任何有用的东西。
'GetThemeStream()'不使用'GetLastError函数()'报告错误。它返回一个'HRESULT',这是实际的错误代码,其中0表示成功。那么当没有流提供时,它实际返回什么值? –
@RemyLebeau,它总是返回-2147023728($ 80070490) - 未找到元素。我做了一个编辑。 – zig
那么你就无能为力了。你想要的流不存在 –