GetThemeStream用法

我对GetThemeStream函数很困惑

HRESULT GetThemeStream( _In_ HTHEME hTheme, _In_ int iPartId, _In_ int iStateId, _In_ int iPropId, _Out_ VOID **ppvStream, _Out_ DWORD *pcbStream, _In_ HINSTANCE hInst ); 

如何使用这个function? 我应该将哪个参数传递给ppvStream

更新:

我正在尝试将它与delphi一起使用,来自UxTheme的声明:

 function GetThemeStream(hTheme: HTHEME; iPartId: Integer; iStateId: Integer; iPropId: Integer; var ppvStream: Pointer; var pcbStream: DWORD; hInst: HINST): HResult; stdcall; var h: HTHEME; Res: HResult; PBuf, PPBuf: Pointer; BufSize: Cardinal; h := OpenThemeData(Handle, 'DWMWINDOW'); if h = 0 then Exit; PBuf := nil; PPBuf := @PBuf; Res := GetThemeStream(h, WP_FRAMELEFT, CBS_HOT, TMT_DISKSTREAM, PPBuf, BufSize, hInstance); if Res  S_OK then Exit; 

这里我有BufSize = 75005,Res = S_OK,但PBuf(nil)没什么,可能我发送参数不正确?

正确使用此function,感谢Vista Style Builder程序的作者Andreas Verhoeven

 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); 

使用其他示例更新:

 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 = 'SOFTWARE\Microsoft\Windows\CurrentVersion\ThemeManager'; 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;