更改系统颜色
Changing System Colors
感谢您抽出宝贵时间帮助我。
我正在使用 PowerShell
构建 GUI,我想覆盖默认系统颜色。
例如,当控件突出显示(TextBox
或 ComboBox
)时,窗体显示系统颜色。我想更改颜色以使用 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'
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
,也就是在控件中选中的item的文字颜色。
要查看有关 SetSysColors
的更多信息,请检查 PInvoke. Also, go here 以查找更多颜色代码。
我不知道是否可以使用 WinForms
或 SetSysColor
只为 PowerShell GUI 设置突出显示颜色,而没有其他设置,但您可以考虑的一种方法是使用WPF
TextBox
而不是 WinForms
。这样你就可以使用 SelectionBrush
和 SelectionOpacity
:
[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
感谢您抽出宝贵时间帮助我。
我正在使用 PowerShell
构建 GUI,我想覆盖默认系统颜色。
例如,当控件突出显示(TextBox
或 ComboBox
)时,窗体显示系统颜色。我想更改颜色以使用 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'
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
,也就是在控件中选中的item的文字颜色。
要查看有关 SetSysColors
的更多信息,请检查 PInvoke. Also, go here 以查找更多颜色代码。
我不知道是否可以使用 WinForms
或 SetSysColor
只为 PowerShell GUI 设置突出显示颜色,而没有其他设置,但您可以考虑的一种方法是使用WPF
TextBox
而不是 WinForms
。这样你就可以使用 SelectionBrush
和 SelectionOpacity
:
[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