2017-11-25 203 views
2

我想保存原始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; 

问:我如何可以节省BUTTONBP_PUSHBUTTON)部分与PBS_NORMAL的状态到使用GetThemeStream一个PNG?

文档非常差,网上有任何例子。我努力找到一些关于如何使用这些函数的线索,但是我找不到任何有用的东西。

+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?

相关问题