2017-11-25 9 views
2

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の状態でBUTTONBP_PUSHBUTTON)の部分を保存することができますどのように

ドキュメントは非常に不良で、Web上には例があります。私はこの機能の使い方についていくつかのリードを見つけるために大変努力しましたが、何か有用なものを見つけることができませんでした。

+3

'GetThemeStream()' 'のGetLastError()'エラーを報告するためには使用されません。これは実際のエラーコードである 'HRESULT'を返します。ここで0は成功を意味します。それで、ストリームが提供されていないときに実際にどのような価値が返ってくるのですか? –

+0

@RemyLebeau、それは常に-2147023728($ 80070490)を返します - 要素が見つかりません。私は編集をしました。 – zig

+1

あなたができることは何もありません。あなたが望むストリームは存在しません –

答えて

1

もう少し掘り下げた後、@RemyLebeauは正しかったと私はGetThemeStreamで何もできません。特にドキュメンテーションは冗談だからです。

"働く"唯一のものはGetThemeBitmapです。それ自体では謎でもあります。部分の状態はであり、出力ビットマップにはすべての使用可能な状態が含まれています。

enter image description here

も参照してください:How to get an icon associated with Windows theme?

関連する問題