在网上没有找到现成的代码,只能DIY了。
方法和步骤如下:
1、检查注册表中HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Themes/LastTheme下DisplayName of Modified的值,若其值非空,则为当前主题名;若其值为空,则往下做2。
2、若其值为空,则检查HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/ThemeManager下的ThemeActive项,若其值为字符串"0",则当前使用的是“windows经典”风格;若其值为字符串"1",则需要往下做3。
3、有两种方法可以获得当前主题对应的文件:
一种方法是继续访问注册表HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Themes/LastTheme下的ThemeFile项的值,其值为当前使用的主题文件名(如:%SystemRoot%/resources/Themes/luna/luna.msstyles);
若ThemeFile值为空, 则使用HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/ThemeManager下DllName项的值作为当前使用的主题文件名。
另一种方法是使用uxtheme.dll中的API函数GetCurrentThemeName()来获取当前主题文件名。
4、主题文件(如%SystemRoot%/resources/Themes/luna/luna.msstyles)对应的具体主题名称一般存放在同名的*.theme文件(如:%SystemRoot%/Resources/Themes/Luna.theme)中。
*.theme文件结构与.INI文件类似,其
[Theme]节中的DisplayName项就是具体主题名称。
如果DisplayName项的值为:“@themeui.dll,-2016”这样的格式,我们可以从HKEY_CURRENT_USER/Software/Microsoft/Windows/ShellNoRoam/MUICache获取该值对应的具体名称,如,"@themeui.dll,-2016"对应的值为"Windows 经典"。
具体代码如下:
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;文件名:SysTheme.asm
;功 能:显示当前系统主题名
;作 者:PurpleEndurer,2009-10-29,第1版
;开发环境:WinXPPROSP3+MASM32v8;
; 源代码和EXE下载地址:
; 1、http://download.youkuaiyun.com/source/1780209; 2、http://purpleendurer.ys168.com/
;
;log
;-----------------------------------------
;2009-10-29修改GetSysThemeName1()&GetSysThemeName2()
;2009-09-27创建!
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.386
.modelflat,stdcall
optioncasemap:none; 2、http://purpleendurer.ys168.com/
;
include/masm32/include/windows.inc
include/masm32/include/kernel32.inc
includelib/masm32/lib/kernel32.lib
include/masm32/include/user32.inc
includelib/masm32/lib/user32.lib
include/masm32/include/advapi32.inc
includelib/masm32/lib/advapi32.lib
GetSysThemeName1 proto:LPSTR
GetSysThemeName2 proto:LPSTR,:DWORD
TranMsstylesFile2ThemeFileSpecproto:LPSTR
ExpandEnvironmentFileSpec proto:LPSTR
GetThemeDispName proto:LPSTR
TranDllNum2Name proto:LPSTR
IsWinClassStyle proto:LPSTR
IsModifiedTheme proto:LPSTR
IsUnknownTheme proto:LPSTR
;sssssssssssssssssssssssssssssssssssssssssssss
.data
;sssssssssssssssssssssssssssssssssssssssssssss
g_szAppNamedb"当前主题",0
g_szWinClassStyledb"windows经典",0
;g_szWinXPdb"WindowsXP",0
g_szRegThemeManager_Pathdb"Software/Microsoft/Windows/CurrentVersion/ThemeManager",0
g_szFailOpenRegKeydb"未能打开注册键!",0
g_szThemeActivedb"ThemeActive",0
g_szREG_SZdb"REG_SZ",0
g_szREG_EXPAND_SZdb"REG_EXPAND_SZ",0
;g_szFailGetThemeActiveValuedb"未能获取ThemeActive值",0
g_szDllNamedb"DllName",0
g_szRegLastTheme_Pathdb"Software/Microsoft/Windows/CurrentVersion/Themes/Last"
g_szThemedb"Theme",0
g_szThemeFiledb"ThemeFile",0
g_szFailGetThemeFileValuedb"未能获取ThemeFile值",0
g_szUnknowndb"未知",0
g_szDisplayName_of_Modifieddb"DisplayNameofModified",0
g_szFailLoadUxtheme_dlldb"未能装载"
g_szUxtheme_dlldb"uxtheme.dll",0
g_szFailGetCurrentThemeNameAdressdb"获取地址失败:"
g_szGetCurrentThemeNamedb"GetCurrentThemeName",0
g_szFailRunGetCurrentThemeNamedb"运行GetCurrentThemeName失败",0
g_szDot_themedb".theme",0
g_szFailTranToThemeFiledb"未能转换为theme文件",0
g_szMUICache_Pathdb"Software/Microsoft/Windows/ShellNoRoam/MUICache",0
g_szDisplayNamedb"DisplayName",0
g_szQuestiondb"?",0
g_szSysThemeNamedbMAX_PATHdup(?)
;sssssssssssssssssssssssssssssssssssssssssssss
.code
;sssssssssssssssssssssssssssssssssssssssssssss
start:
movdwordptrg_szSysThemeName,NULL
invokeGetSysThemeName1,addrg_szSysThemeName
invokeMessageBox,NULL,addrg_szSysThemeName,addrg_szAppName,MB_OK
movdwordptrg_szSysThemeName,NULL
invokeGetSysThemeName2,addrg_szSysThemeName,sizeofg_szSysThemeName
invokeMessageBox,NULL,addrg_szSysThemeName,addrg_szAppName,MB_OK
invokeExitProcess,NULL
;///////////////////////////////////////////////////
;获取当前系统主题名
;///////////////////////////////////////////////////
GetSysThemeName1proclpszSysThemeName:LPSTR
localbModified[MAX_PATH]:byte
localhKey1:HKEY
localbDllNameValue[MAX_PATH]:byte
localdwDllNameValueLen:dword
localbThemeFileValue[MAX_PATH]:byte
localdwThemeFileValueLen:dword
;invokeIsWinClassStyle,lpszSysThemeName
;moveax,lpszSysThemeName
;cmpdwordptr[eax],NULL
;jne@GetSysThemeName1Ret
invokeIsModifiedTheme,lpszSysThemeName
testeax,eax
jz@GetSysThemeName1Ret
invokelstrcpy,addrbModified,lpszSysThemeName
movhKey1,0
;---打开注册表值DllName所在键ThemeManager
invokeRegOpenKey,HKEY_CURRENT_USER,addrg_szRegThemeManager_Path,addrhKey1
.IFeax==ERROR_SUCCESS
;---取“DllName”值备用
movdwDllNameValueLen,sizeofbDllNameValue
invokeRegQueryValueEx,hKey1,addrg_szDllName,NULL,addrg_szREG_EXPAND_SZ/
,addrbDllNameValue,addrdwDllNameValueLen
.ifeax!=ERROR_SUCCESS
movbyteptrbDllNameValue,NULL
.endif
invokeRegCloseKey,hKey1
;---打开注册表值“ThemeFile”所在键LastTheme
invokeRegOpenKey,HKEY_CURRENT_USER,addrg_szRegLastTheme_Path,addrhKey1
.ifeax!=ERROR_SUCCESS
invokelstrcpy,lpszSysThemeName,addrg_szFailOpenRegKey
.else
;---取“ThemeFile”值
movdwThemeFileValueLen,sizeofbThemeFileValue
invokeRegQueryValueEx,hKey1,addrg_szThemeFile,NULL,addrg_szREG_EXPAND_SZ/
,addrbThemeFileValue,addrdwThemeFileValueLen
.IFeax!=ERROR_SUCCESS
invokelstrcpy,lpszSysThemeName,addrg_szFailGetThemeFileValue
.ELSE
invokelstrcpy,lpszSysThemeName,addrbThemeFileValue
;---“ThemeFile”值为空吗?
;invokelstrlen,lpszSysThemeName
;testeax,eax
;.ifZERO?
moveax,lpszSysThemeName
.ifbyteptr[eax]==NULL
;---若ThemeFile值为空,则使用DllName值
.IFbyteptrbDllNameValue!=NULL
invokelstrcpy,lpszSysThemeName,addrbDllNameValue
invokeExpandEnvironmentFileSpec,lpszSysThemeName
invokeTranMsstylesFile2ThemeFileSpec,lpszSysThemeName
testeax,eax
jz@F
.ENDIF
.else;否则获取主题文件中DisplayName值
@@:
invokeGetThemeDispName,lpszSysThemeName
.endif
invokelstrcat,lpszSysThemeName,addrbModified
.ENDIF
.endif
.ENDIF
.if(hKey1!=0)
invokeRegCloseKey,hKey1
.endif
invokeIsUnknownTheme,lpszSysThemeName
@GetSysThemeName1Ret:
ret
GetSysThemeName1endp
GetCurrentThemeNametypedefproto:LPWSTR,:DWORD,:LPWSTR,:DWORD,:LPWSTR,:DWORD
_GetCurrentThemeNametypedefptrGetCurrentThemeName
GetSysThemeName2proclpszSysThemeName:LPSTR,dwSysThemeNameLen:DWORD
localbModified[MAX_PATH]:byte
localbThemeFile[MAX_PATH*2]:byte
locallpfnGetCurrentThemeName:_GetCurrentThemeName
invokeIsWinClassStyle,lpszSysThemeName
moveax,lpszSysThemeName
cmpdwordptr[eax],NULL
jne@GetSysThemeName2Ret
invokeIsModifiedTheme,lpszSysThemeName
testeax,eax
jz@GetSysThemeName2Ret
invokelstrcpy,addrbModified,lpszSysThemeName
invokeLoadLibrary,addrg_szUxtheme_dll
.IFeax==NULL
invokelstrcpy,lpszSysThemeName,addrg_szFailLoadUxtheme_dll
.ELSE
pusheax;pushforFreeLibrary
invokeGetProcAddress,eax,addrg_szGetCurrentThemeName
.ifeax==NULL
invokelstrcpy,lpszSysThemeName,addrg_szFailGetCurrentThemeNameAdress
.else
movlpfnGetCurrentThemeName,eax
;HRESULTGetCurrentThemeName(
;LPWSTRpszThemeFileName,//[out]Pointertoastringthatreceivesthethemepathandfilename.
;intdwMaxNameChars,//[in]Valueoftypeintthatcontainsthemaximumnumberofcharactersallowedinthethemefilename.
;LPWSTRpszColorBuff,//[out]Pointertoastringthatreceivesthecolorschemename.ThisparametermaybesettoNULL.
;intcchMaxColorChars,//[in]Valueoftypeintthatcontainsthemaximumnumberofcharactersallowedinthecolorschemename.
;LPWSTRpszSizeBuff,//[out]Pointertoastringthatreceivesthesizename.ThisparametermaybesettoNULL.
;intcchMaxSizeChars//[in]Valueoftypeintthatcontainsthemaximumnumberofcharactersallowedinthesizename.
;);
;Retrievesthenameofthecurrentvisualstyle,andoptionallyretrievesthecolorschemenameandsizename.
;TheresultmaybereadfromHKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/ThemeManager/ThemeActive,DllName
;eg.C:/WINDOWS/Resources/Themes/Luna/luna.msstyles,
;
;ReturnsS_OKifsuccessful,otherwiseanerrorcode.
invokelpfnGetCurrentThemeName,addrbThemeFile,(sizeofbThemeFile)/2,NULL,NULL,NULL,NULL
.IFeax!=S_OK
invokelstrcpy,lpszSysThemeName,addrg_szFailRunGetCurrentThemeName
;invokelstrcpy,lpszSysThemeName,addrg_szWinClassStyle;当前主题为"Windows经典"
.ELSE
;invokeMessageBox,NULL,addrbThemeFile,addrg_szAppName,MB_OK
invokeWideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,addrbThemeFile,-1/
,lpszSysThemeName,dwSysThemeNameLen,NULL,NULL
;invokeMessageBox,NULL,lpszSysThemeName,addrg_szAppName,MB_OK
invokeTranMsstylesFile2ThemeFileSpec,lpszSysThemeName
testeax,eax
.ifZERO?
invokeGetThemeDispName,lpszSysThemeName
.endif
.ENDIF
invokelstrcat,lpszSysThemeName,addrbModified
.endif
callFreeLibrary
.ENDIF
invokeIsUnknownTheme,lpszSysThemeName
@GetSysThemeName2Ret:
ret
GetSysThemeName2endp
IsWinClassStyleproclpszSysThemeName:LPSTR
localhKey1:HKEY
localbThemeActiveValue[2]:byte
localdwThemeActiveValueLen:dword
moveax,lpszSysThemeName
movdwordptr[eax],NULL
;---打开注册表值ThemeActive所在键ThemeManager
invokeRegOpenKey,HKEY_CURRENT_USER,addrg_szRegThemeManager_Path,addrhKey1
.IFeax==ERROR_SUCCESS
;---取ThemeActive值
movdwThemeActiveValueLen,sizeofbThemeActiveValue
invokeRegQueryValueEx,hKey1,addrg_szThemeActive,NULL,addrg_szREG_SZ/
,addrbThemeActiveValue,addrdwThemeActiveValueLen
.ifeax==ERROR_SUCCESS&&(byteptrbThemeActiveValue=='0');值为'0',当前主题为"Windows经典"
invokelstrcpy,lpszSysThemeName,addrg_szWinClassStyle
.endif
invokeRegCloseKey,hKey1
.ENDIF
ret
IsWinClassStyleendp
;/////////////////////////////////////////////
;取"@xxx.dll,-nnn"的对应值
;如."@themeui.dll,-2016"="Windows经典"
;/////////////////////////////////////////////
TranDllNum2NameproclpszDllNum:LPSTR
localhKey1:HKEY
localbValue[MAX_PATH]:byte
localdwValueLen:dword
;---打开注册表键MUICache
invokeRegOpenKey,HKEY_CURRENT_USER,addrg_szMUICache_Path,addrhKey1
.IFeax==ERROR_SUCCESS
;---取lpszDllNum对应值
movdwValueLen,sizeofbValue
invokeRegQueryValueEx,hKey1,lpszDllNum,NULL,addrg_szREG_SZ/
,addrbValue,addrdwValueLen
.ifeax==ERROR_SUCCESS
invokelstrcpy,lpszDllNum,addrbValue
.endif
invokeRegCloseKey,hKey1
;.ELSE
;invokelstrcpy,lpszDllNum,addrg_szFailOpenRegKey
.ENDIF
ret
TranDllNum2Nameendp
;//////////////////////////////////////////////////////////////////////////////////////
;将文件说明符中包含环境变量转化具体值
;如将:%SystemRoot%/resources/Themes/Aquanox/Aquanox.msstyles
;转为:c:/windows/resources/Themes/Aquanox/Aquanox.msstyles
;//////////////////////////////////////////////////////////////////////////////////////
ExpandEnvironmentFileSpecproclpszFileSpec:LPSTR
localbFileSpec[MAX_PATH]:byte
invokeExpandEnvironmentStrings,lpszFileSpec,addrbFileSpec,sizeofbFileSpec
invokelstrcpy,lpszFileSpec,addrbFileSpec
ret
ExpandEnvironmentFileSpecendp
;///////////////////////////////////////////////////////////////////
;获取指定主题文件中的DisplayName值
;如C:/WINDOWS/Resources/Themes/Aquanox.theme中
;[Theme]
;DisplayName=经典-深色Aquanox风格
;///////////////////////////////////////////////////////////////////
GetThemeDispNameproclpszThemeFileSpec:LPSTR
localbDispNameValue[MAX_PATH]:byte
invokeExpandEnvironmentFileSpec,lpszThemeFileSpec
invokeGetPrivateProfileString,ADDRg_szTheme,ADDRg_szDisplayName/
,ADDRg_szQuestion,ADDRbDispNameValue,SIZEOFbDispNameValue,lpszThemeFileSpec
.ifbyteptrbDispNameValue!='?'
invokelstrcpy,lpszThemeFileSpec,ADDRbDispNameValue
.IFbyteptrbDispNameValue=="@"
invokeTranDllNum2Name,lpszThemeFileSpec
.ENDIF
.endif
ret
GetThemeDispNameendp
;///////////////////////////////////////////////////////////////////////////
;生成.msstyles文件对应的.theme文件
;如C:/WINDOWS/Resources/Themes/luna/luna.msstyles
;对应:C:/WINDOWS/Resources/Themes/Luna.theme
;输入:lpszFileSpec-指向存储.msstyles文件说明符字符串
;输出:
;若成功,eax=0,lpszFileSpec指向存储对应的.theme文件的文件说明符字符串
;否则eax=1,lpszFileSpec指向存储出错信息的字符串
;///////////////////////////////////////////////////////////////////////////
TranMsstylesFile2ThemeFileSpecproclpszFileSpec:LPSTR
invokelstrlen,lpszFileSpec
;---从串末向前定位最后一个'/'字符
movedi,lpszFileSpec
addedi,eax
.repeat
decedi
moval,byteptr[edi]
.until(edi==lpszFileSpec||al=='/')
.IF(edi==lpszFileSpec)
invokelstrcpy,lpszFileSpec,addrg_szFailTranToThemeFile
xoreax,eax
inceax
.ELSE
movbyteptr[edi],0
invokelstrcat,lpszFileSpec,addrg_szDot_theme
xoreax,eax
.ENDIF
ret
TranMsstylesFile2ThemeFileSpecendp
;/////////////////////////////////////////////////////////////////////////////////////////////////////////////
;取注册表HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/LastTheme
;中的“DisplayNameofModified”项值
;/////////////////////////////////////////////////////////////////////////////////////////////////////////////
IsModifiedThemeproclpszThemeName:LPSTR
localhKey1:HKEY
localbDispNameModifiedValue[30]:byte
localdwDispNameModifiedValueLen:dword
;---打开注册表值“DisplayNameofModified”所在键LastTheme
invokeRegOpenKey,HKEY_CURRENT_USER,addrg_szRegLastTheme_Path,addrhKey1
.ifeax==ERROR_SUCCESS
;---读取“DisplayNameofModified”值
movdwDispNameModifiedValueLen,sizeofbDispNameModifiedValue
invokeRegQueryValueEx,hKey1,addrg_szDisplayName_of_Modified,NULL,addrg_szREG_SZ/
,addrbDispNameModifiedValue,addrdwDispNameModifiedValueLen
.IFeax==ERROR_SUCCESS
invokelstrcpy,lpszThemeName,addrbDispNameModifiedValue
.ENDIF
invokeRegCloseKey,hKey1
.else
.endif
xoreax,eax
;值是否为空或为“更改的主题”。"更"的机内码为0B8FCh
.ifbyteptrbDispNameModifiedValue==NULL||wordptrbDispNameModifiedValue==0FCB8h
inceax
.endif
ret
IsModifiedThemeendp
IsUnknownThemeproclpszThemeName:LPSTR
invokelstrlen,lpszThemeName
testeax,eax
.ifZERO?
invokelstrcpy,lpszThemeName,addrg_szUnknown
.endif
ret
IsUnknownThemeendp
endstart
本文介绍了一种通过检查注册表及使用API函数GetCurrentThemeName()来确定Windows当前主题的方法,并提供了具体的汇编语言实现。
925

被折叠的 条评论
为什么被折叠?



