从vbscript修改XP主题(外观和颜色方案)

时间:2009-03-30 13:20:01

标签: vbscript windows-xp installation themes

有人知道如何使用VBScript修改Windows XP外观和配色方案吗?

我有一个用Visual C ++编写的应用程序需要正确显示Windows XP外观(非经典),我想从安装中设置这个属性。

我使用InstallShield使安装程序和VBScript执行一些自定义操作。因此,如果我可以在visual basic中创建一个脚本来更改此属性,那就太棒了。

4 个答案:

答案 0 :(得分:3)

这应该这样做:

rundll32 shell32.dll,Control_RunDLL desk.cpl desk,@themes /Action:OpenTheme /File:"%WinDir%\Resources\Themes\Luna.theme"

但是,您仍然需要让用户单击“确定”或使用其他实用程序为您执行此操作。

答案 1 :(得分:2)

如果您需要更改各个外观选项(如窗口颜色),则可以在HKEY_CURRENT_USER\Control Panel\AppearanceHKEY_CURRENT_USER\Control Panel\Colors键下修改相应的注册表值。例如,此代码将窗口背景颜色变为cream:

Set oShell = CreateObject("WScript.Shell")
oShell.RegWrite path & "HKCU\Control Panel\Colors\Window", "255 251 240", "REG_SZ"

但请注意,Windows可能仅在重新启动后应用注册表更改。


如果您需要加载准备好的.theme文件,可以使用以下代码:

Const Theme = "C:\MyTheme.theme"

Set oShellApp = CreateObject("Shell.Application")
oShellApp.ControlPanelItem "desk.cpl desk,@Themes /Action:OpenTheme /file:""" & Theme & """" 

虽然正如sascha指出的那样,这只会打开选择了指定主题的“显示属性”对话框;您仍然需要用户单击“确定”或按Enter键。可以使用WshShell.SendKeys方法从脚本代码模拟按键:

Set oShell = CreateObject("WScript.Shell")

' Wait until the Display Properties dialog is opened
While Not oShell.AppActivate("Display Properties")
  WScript.Sleep 500
Wend

' Send the Enter key to close the dialog and apply the theme
Do
  oShell.SendKeys "~"
  WScript.Sleep 500
Loop While oShell.AppActivate "Display Properties"

但是这种方法不可靠,因为用户可以点击其他地方,因此Enter会转到另一个窗口。此外,“显示属性”对话框标题是与语言环境相关的。

另一种选择是使用从Windows XP SP1开始的themeui.dll库提供的Theme.Manager API,但它似乎不适用于XP SP2。无论如何,您可以找到示例代码here

答案 2 :(得分:1)

我所做的是创建一个c ++ dll,我在Install Shield中用作自定义动作。在这个DLL中我使用uxtheme.dll将luna.msstyle文件设置为主题。这是完成工作的功能:

bool SetVisualStyle()
{
    TCHAR szUxTheme[MAX_PATH+1];
    UINT nSize = ::GetSystemDirectory(  szUxTheme,
                                        MAX_PATH);
    szUxTheme[nSize] = '\0';

    wcscat_s(   szUxTheme,
                MAX_PATH - nSize,
                L"\\uxtheme.dll");

    HMODULE hModule = ::LoadLibrary(szUxTheme);
    if(!hModule)
    {
        return false;
    }

    typedef int (__stdcall *SETVISUALSTYLE) (   LPCWSTR szTheme, 
                                                LPCWSTR szScheme, 
                                                LPCWSTR szFontType, 
                                                int nReserved);
    SETVISUALSTYLE pFnSetVisualStyle;
    pFnSetVisualStyle = (SETVISUALSTYLE)GetProcAddress( hModule,
                                                        MAKEINTRESOURCEA(LOWORD(65)));
    if(pFnSetVisualStyle)
    {
        pFnSetVisualStyle(  L"C:\\WINDOWS\\Resources\\Themes\\Luna\\luna.msstyles", 
                            L"NormalColor",
                            L"NormalSize",
                            1|32);
    }

    ::FreeLibrary(hModule);
    return true;
}

它并不完美,但却能满足我的需求。

我希望这可以帮助别人......如果你有任何疑问,请不要犹豫,问我。

干杯。

答案 3 :(得分:0)

'Script name: yourtheme.vbs

'Object: Automate without command prompt the application of a Windows Theme by a VB script

'

'SCRIPT CONTENTS:

'Define Variables : 

    Set ShellApp = CreateObject("Shell.Application")
    Set WsShell = CreateObject("Wscript.Shell")


'

'Define path for your file theme (put it on a network share and don't forget to apply "read and execute" ACL for your Users)

    Theme = "typeyoursharepath\typeyourtheme.theme"
    Theme = """" + Theme + """"


'Open Display Properties Windows, Select your theme and apply with keep focus on Windows

    ShellApp.ControlPanelItem cstr("desk.cpl desk,@Themes /Action:OpenTheme /file:" & Theme)
    Wscript.Sleep 100
    WsShell.SendKeys "{ENTER}"
    While WsShell.AppActivate ("Display Properties") = TRUE
    WsShell.AppActivate "Display Properties"
    Wend


'END OF SCRIPT 

在Windows XP和Windows Server 2003R2 X86上成功应用,并在Citix XenApp 4.6FP7(操作系统:W2003R2X86 SP2)下应用Windows Embedded主题,蓝色背景颜色更亮。

Citrix会话用户看起来很棒!

在Citrix XenApp下的用户登录时集成到用户配置GPO中。