GetThemeStream
機能を使用して、特定の状態のテーマ部分の元のPNG/BMP(アルファ付き32ビット)を保存します。 GetThemeStream usageGetThemeStreamを使ってWindowsのテーマ部分を保存するには? (DWMWINDOW以外)
しかし、私は以外の他のテーマのパーツを取得できませんよ:
ここで説明するように、それは部品に適しています。
OpenThemeData(0, 'BUTTON')
はOKですが、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;
Q:私はGetThemeStream
を使用してPNGへPBS_NORMAL
の状態でBUTTON
(BP_PUSHBUTTON
)の部分を保存することができますどのように?
ドキュメントは非常に不良で、Web上には例があります。私はこの機能の使い方についていくつかのリードを見つけるために大変努力しましたが、何か有用なものを見つけることができませんでした。
'GetThemeStream()' 'のGetLastError()'エラーを報告するためには使用されません。これは実際のエラーコードである 'HRESULT'を返します。ここで0は成功を意味します。それで、ストリームが提供されていないときに実際にどのような価値が返ってくるのですか? –
@RemyLebeau、それは常に-2147023728($ 80070490)を返します - 要素が見つかりません。私は編集をしました。 – zig
あなたができることは何もありません。あなたが望むストリームは存在しません –