【问题标题】:Changing System Colors更改系统颜色
【发布时间】:2018-10-03 01:42:47
【问题描述】:

感谢您抽出宝贵时间帮助我。

我正在使用PowerShell 构建一个 GUI,我想覆盖默认系统颜色。

例如,当一个控件被突出显示(TextBoxComboBox)时,表单会显示系统颜色。我想更改颜色以使用AliceBlue。到目前为止,我尝试了以下代码,但无济于事:

[System.Drawing.SystemColors]::Highlight = 'AliceBlue'
[System.Drawing.SystemColors]::HighlightText = 'AliceBlue'
[System.Drawing.SystemColors]::ScrollBar = 'AliceBlue'
[System.Drawing.SystemColors]::Control = 'AliceBlue'
[System.Drawing.SystemColors]::HotTrack = 'AliceBlue'
[System.Drawing.SystemColors]::Window = 'AliceBlue'
[System.Drawing.SystemColors]::WindowFrame = 'AliceBlue'

【问题讨论】:

    标签: winforms powershell colors highlight systemcolors


    【解决方案1】:

    documentation 表示您尝试设置的那些属性是只读的。

    您可以通过调用user32.dll SetSysColors 函数来做到这一点:

    $signature = @'
    [DllImport("user32.dll")]
    public static extern bool SetSysColors(
        int cElements, 
        int [] lpaElements,
        uint [] lpaRgbValues);
    '@
    
    $type = Add-Type -MemberDefinition $signature `
                     -Name Win32Utils `
                     -Namespace SetSysColors `
                     -PassThru
    
    $color = [Drawing.Color]::AliceBlue
    # For RGB color values: 
    # $color = [Drawing.Color]::FromArgb(255,255,255) 
    $elements = @('13')
    $colors = [Drawing.ColorTranslator]::ToWin32($color)
    
    $type::SetSysColors($elements.Length, $elements, $colors)
    

    其中13 元素表示COLOR_HIGHLIGHT,它是控件中所选项目的颜色。


    运行上述代码后,结果如下:

    组合框

    文本框


    您可以看到实际文本的颜色发生了变化,几乎看不到。要改变这一点,只需运行:

    $color = [Drawing.Color]::Black
    $elements = @('14')
    $colors = [Drawing.ColorTranslator]::ToWin32($color)
    $type::SetSysColors($elements.Length, $elements, $colors)
    

    其中14 代表COLOR_HIGHLIGHTTEXT,它是控件中所选项目的文本颜色。

    要了解有关SetSysColors 的更多信息,请查看PInvoke。此外,前往here 查找更多颜色代码。


    我不知道是否可以仅使用WinFormsSetSysColor 为PowerShell GUI 设置突出显示颜色,但您可以考虑的一种方法是使用WPF TextBox而不是WinForms。这样你就可以使用SelectionBrushSelectionOpacity

    [xml]$xaml = @"
    <Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="Window" 
           Title="Initial Window" 
           WindowStartupLocation = "CenterScreen" 
           ResizeMode="NoResize"
           SizeToContent = "WidthAndHeight" 
           ShowInTaskbar = "True" 
           Background = "lightgray"> 
        <StackPanel >  
            <Label Content='Type in this textbox' />
            <TextBox x:Name="InputBox" 
                        Height = "50" 
                        SelectionBrush= "Green"
                        SelectionOpacity = "0.5" />  
        </StackPanel>
    </Window>
    "@
    
    $reader=(New-Object System.Xml.XmlNodeReader $xaml)
    $Window=[Windows.Markup.XamlReader]::Load( $reader )
    
    
    $Window.ShowDialog() | Out-Null
    

    【讨论】:

    • 亲爱的 Bassie, 非常感谢您在短时间内提供的所有帮助。本周休息愉快!
    • 亲爱的 Bassie,运行上述代码时出现问题。代码更改需要颜色,但代码对完成操作系统有影响。例如,当我打开记事本并突出显示文本时,我可以看到 AliceBlue 颜色。有没有办法限制 Winform 的颜色?谢谢
    • @NickPrice 嗨尼克,我为我的答案添加了另一个可能的解决方案,但它要求您使用 WPF TextBox。希望有帮助
    • 亲爱的 Bassie,我尝试了您的 WPF 代码,但它在 $Window.ShowDialog() 处给出错误“您不能在空值表达式上调用方法”。顺便说一句,有没有办法通过使用我可以在我的 PowerShell 表单中使用的 WPF 代码来覆盖系统颜色?再次感谢您的宝贵意见。 - 谢谢你
    • 基本上它说“错误:无法找到类型 [Windows.Markup.XamlReader]:确保已加载包含此类型的程序集。”
    猜你喜欢
    • 2012-09-17
    • 2011-12-25
    • 1970-01-01
    • 2015-02-05
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    相关资源
    最近更新 更多