Correct usage of this function, thanks to Andreas Verhoeven, author of the program Vista Style Builder:
var
hTh: HTHEME;
hLib: HMODULE;
DllName: string;
Png: TPngImage;
MS: TMemoryStream;
BufSize: Cardinal;
PBuf: Pointer;
hTh := OpenThemeData(...);
// DllName is path to the theme file
hLib := LoadLibraryEx(PChar(DllName), 0, LOAD_LIBRARY_AS_DATAFILE);
// Read Theme Png stream
GetThemeStream(hTh, 0, 0, TMT_DISKSTREAM, PBuf, BufSize, hLib);
// Copy data to memory stream
MS := TMemoryStream.Create;
MS.WriteBuffer(PByteArray(PBuf)^[0], BufSize);
MS.Position := 0;
// Copy memory stream to Png
Png := TPngImage.Create;
Png.LoadFromStream(MS);
Update with additional example:
var
ThemeRectLeft,
ThemeRectLeftInactive,
ThemeRectMiddle,
ThemeRectMiddleInactive,
ThemeRectCloseRight,
ThemeRectCloseRightInactive,
ThemeRectCloseSingle,
ThemeRectCloseSingleInactive,
ThemeRectMinIco,
ThemeRectMaxIco,
ThemeRectRestoreIco,
ThemeRectHelpIco,
ThemeRectCloseIco: TRect;
var
THEME_MIDDLE_IMAGES : Integer = 3;
THEME_MIDDLE_IMAGES2 : Integer = 4; // Inactive Window
THEME_LEFT_IMAGES : Integer = 5;
THEME_LEFT_IMAGES2 : Integer = 6; // Inactive Window
THEME_CLOSE_RIGHT_IMAGES : Integer = 7;
THEME_CLOSE_RIGHT_IMAGES2 : Integer = 8; // Inactive Window
THEME_CLOSE_SINGLE_IMAGES : Integer = 9;
THEME_CLOSE_SINGLE_IMAGES2 : Integer = 10; // Inactive Window
THEME_CLOSE_HOT_FRAME : Integer = 11; // Win7, Vista
THEME_HOT_FRAME : Integer = 16; // Win7, Vista
THEME_CLOSE_ICONS : Integer = 12;
THEME_HELP_ICONS : Integer = 16; // Win7, Vista: 17
THEME_MAX_ICONS : Integer = 20; // Win7, Vista: 21
THEME_MIN_ICONS : Integer = 24; // Win7, Vista: 25
THEME_RESTORE_ICONS : Integer = 28; // Win7, Vista: 29
THEME_CLOSE_SMALL_IMAGES : Integer = 37; // Win7, Vista: 45
THEME_CLOSE_SMALL_IMAGES2 : Integer = 38; // Win7, Vista: 46 Inactive Window
THEME_CLOSE_SMALL_HOT_FRAME : Integer = 47; // Win7, Vista
THEME_CLOSE_SMALL_ICONS : Integer = 39; // Win7, Vista: 48
function LoadThemePng(var APng: TPngImage; const APathToSave: string): Boolean;
const
ThemeRegPath = 'SOFTWAREMicrosoftWindowsCurrentVersionThemeManager';
var
hTh: HTHEME;
hLib: HMODULE;
DllName, Path: string;
MS: TMemoryStream;
BufSize: Cardinal;
PBuf: Pointer;
I: Integer;
Rt: TRect;
imgPng: TPngImage;
begin
Result := False;
hTh := OpenThemeData(0, 'DWMWINDOW');
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
// Read Theme Png stream
if GetThemeStream(hTh, 0, 0, TMT_DISKSTREAM, PBuf, BufSize, hLib) = S_OK then begin
MS := TMemoryStream.Create;
try
MS.WriteBuffer(PByteArray(PBuf)^[0], BufSize);
MS.Position := 0;
APng.LoadFromStream(MS);
Result := True;
finally
MS.Free;
end;
end;
finally
FreeLibrary(hLib);
end;
GetThemeRect(hTh, THEME_LEFT_IMAGES, 0, TMT_ATLASRECT, ThemeRectLeft);
GetThemeRect(hTh, THEME_LEFT_IMAGES2, 0, TMT_ATLASRECT, ThemeRectLeftInactive);
GetThemeRect(hTh, THEME_MIDDLE_IMAGES, 0, TMT_ATLASRECT, ThemeRectMiddle);
GetThemeRect(hTh, THEME_MIDDLE_IMAGES2, 0, TMT_ATLASRECT, ThemeRectMiddleInactive);
GetThemeRect(hTh, THEME_CLOSE_RIGHT_IMAGES, 0, TMT_ATLASRECT, ThemeRectCloseRight);
GetThemeRect(hTh, THEME_CLOSE_RIGHT_IMAGES2, 0, TMT_ATLASRECT, ThemeRectCloseRightInactive);
GetThemeRect(hTh, THEME_CLOSE_SINGLE_IMAGES, 0, TMT_ATLASRECT, ThemeRectCloseSingle);
GetThemeRect(hTh, THEME_CLOSE_SINGLE_IMAGES2, 0, TMT_ATLASRECT, ThemeRectCloseSingleInactive);
if (Win32MajorVersion = 6) and (Win32MinorVersion in [0, 1]) then begin
GetThemeRect(hTh, THEME_MIN_ICONS + 1, 0, TMT_ATLASRECT, ThemeRectMinIco);
GetThemeRect(hTh, THEME_MAX_ICONS + 1, 0, TMT_ATLASRECT, ThemeRectMaxIco);
GetThemeRect(hTh, THEME_RESTORE_ICONS + 1, 0, TMT_ATLASRECT, ThemeRectRestoreIco);
GetThemeRect(hTh, THEME_HELP_ICONS + 1, 0, TMT_ATLASRECT, ThemeRectHelpIco);
end
else begin
GetThemeRect(hTh, THEME_MIN_ICONS, 0, TMT_ATLASRECT, ThemeRectMinIco);
GetThemeRect(hTh, THEME_MAX_ICONS, 0, TMT_ATLASRECT, ThemeRectMaxIco);
GetThemeRect(hTh, THEME_RESTORE_ICONS, 0, TMT_ATLASRECT, ThemeRectRestoreIco);
GetThemeRect(hTh, THEME_HELP_ICONS, 0, TMT_ATLASRECT, ThemeRectHelpIco);
end;
GetThemeRect(hTh, THEME_CLOSE_ICONS, 0, TMT_ATLASRECT, ThemeRectCloseIco);
if APathToSave <> '' then begin
Path := IncludeTrailingPathDelimiter(APathToSave);
APng.SaveToFile(Path + 'Theme_Full.png');
for I := 1 to 99 do begin
imgPng := TPngImage.Create;
try
if GetThemeRect(hTh, I, 0, TMT_ATLASRECT, Rt) = S_OK then begin
CopyPng(APng, imgPng, Rt);
imgPng.SaveToFile(Path + 'Theme_Img_' + IntToStr(I) + '.png');
end;
finally
imgPng.Free;
end;
end;
end;
finally
CloseThemeData(hTh);
end;
end;