我想使用GetThemeStream
功能以特定状态保存主题部分的原始PNG / BMP(带有alpha的32位)。
如以下所述,它对于DWMWINDOW
零件非常有效:GetThemeStreamusage
但是我无法获得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中?该文档非常差,并且网上有任何示例。我竭尽全力寻找有关如何使用此功能的线索,但找不到任何有用的东西。
最佳答案
经过更多的挖掘,我认为@RemyLebeau是正确的,GetThemeStream
我无能为力。特别是因为文档是个玩笑。
唯一起作用的是GetThemeBitmap
。这本身也是一个谜。它忽略了部分状态,并且输出位图包含所有可用状态。
另请参阅:How to get an icon associated with Windows theme?
关于delphi - 如何使用GetThemeStream保存Windows主题部分? (DWMWINDOW除外),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47488359/