delphi - 如何使用GetThemeStream保存Windows主题部分? (DWMWINDOW除外)

标签 delphi winapi

我想使用GetThemeStream功能以特定状态保存主题部分的原始PNG / BMP(带有alpha的32位)。
如以下所述,它对于DWMWINDOW零件非常有效:GetThemeStream usage

但是我无法获得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_PUSHBUTTONPBS_NORMALGetThemeStream)零件保存到PNG中?

该文档非常差,并且网上有任何示例。我竭尽全力寻找有关如何使用此功能的线索,但找不到任何有用的东西。

最佳答案

经过更多的挖掘,我认为@RemyLebeau是正确的,GetThemeStream我无能为力。特别是因为文档是个玩笑。

唯一起作用的是GetThemeBitmap。这本身也是一个谜。它忽略了部分状态,并且输出位图包含所有可用状态。

enter image description here

另请参阅:How to get an icon associated with Windows theme?

关于delphi - 如何使用GetThemeStream保存Windows主题部分? (DWMWINDOW除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47488359/

相关文章:

delphi - EInvalidCast 与模拟函数返回指针类型

delphi - 仅关闭一小部分代码的 Delphi 范围检查

c++ - C++:如果没有来自串行端口的新数据,如何忽略ReadFile()?

c - 使用 C 和原始 Win32 设置按钮图标

winapi - Win32 函数获取 C :\ProgramData 的路径

windows - 如何使用 SetWindowsHookEx 和 WH_KEYBOARD Hook 外部进程

delphi - TDictionary 重复条目(Delphi)

delphi - 如何最好地将整数转换为浮点值而不分配给变量?

delphi - Delphi 中的嵌套属性

windows - 寻找 Forms.Screen.DeviceName 的可靠映射以监控 EDID 信息