Joe*_*orn 16 windows-7 notification-area
我正在设置一台 Windows 7 机器,该机器将处于开放状态并被很多人共享。我在所有用户的开始菜单中添加了一个快捷方式,以运行位于系统托盘中的程序。我希望这个程序的托盘图标在默认情况下始终可见,无论谁登录。如果用户真的愿意,可以在他们的个人资料中关闭它,但我需要它至少在开始时设置为始终可见。我怎样才能做到这一点?
我宁愿不显示所有图标,部分原因与它们首先隐藏的原因相同:我不想要混乱。此外,由于这是一台公用计算机,因此正在运行另一个名为 DeepFreeze 的程序,该程序也有一个系统托盘图标,我不希望该图标一直显示。
Ƭᴇc*_*007 12
简而言之,目前,您不能这样做。
没有组策略或首选项来设置它,它跟踪的方式使它特定于当前用户和系统,使得“设置”因实例而异。
如果您想查看它们,它们存储在此处(在注册表中):HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify
。
从这里:
应用程序无法在首次安装时或运行时的任何时间以编程方式始终在系统托盘上显示自己的顶层。这是我们在 Windows 7 中所做的几项更改之一,旨在生成一个更干净、更安静的桌面,让用户可以控制使用他们最喜欢的应用程序和图标自定义顶层。
我们通过不允许程序化促销(临时或显示通知除外)来让用户控制通知区域。假设机器足够安静,当您第一次使用 Shell_NotifyIcon(NIM_ADD, ...) 添加图标时,它会在任务栏上显示 45 秒,然后进入溢出状态。如果用户提升一个图标,它会一直显示在任务栏上。如果用户将其降级,则该图标将永远不会出现在任务栏上。任何促销活动都需要由用户发起。我们通过拖放和通过通知区域图标控制面板在 Windows 7 中使这变得更加容易,并且我们在可用性研究和基于 beta 反馈中看到的是,用户可以毫无困难地发现如何自定义通知行为并将推广他们想要快速访问的图标。
最简单的方法是为所有用户显示所有通知区域图标。这可以通过添加一个(简单的)注册表项来完成:
在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer
创建一个新的 DWORD 值EnableAutoTray
并将其设置0
为关闭通知区域的“自动隐藏”功能。
通过一些 OU 配置和脚本,您也可以在 HKCU 上下文中使用它,如果您只希望某些用户/组发生这种情况。
有关更多信息,请参见此处。
Jos*_*ell 11
我在网上搜索,实际上是随机找到的。
长话短说,PowerShell(提供脚本)和 GPO 的组合。
长话短说,创建一个包含以下内容的 PowerShell 脚本:
param(
[Parameter(Mandatory=$true,HelpMessage='The name of the program')][string]$ProgramName,
[Parameter(Mandatory=$true,HelpMessage='The setting (2 = show icon and notifications 1 = hide icon and notifications, 0 = only show notifications')]
[ValidateScript({if ($_ -lt 0 -or $_ -gt 2) { throw 'Invalid setting' } return $true})]
[Int16]$Setting
)
$encText = New-Object System.Text.UTF8Encoding
[byte[]] $bytRegKey = @()
$strRegKey = ""
$bytRegKey = $(Get-ItemProperty $(Get-Item 'HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify').PSPath).IconStreams
for($x=0; $x -le $bytRegKey.Count; $x++)
{
$tempString = [Convert]::ToString($bytRegKey[$x], 16)
switch($tempString.Length)
{
0 {$strRegKey += "00"}
1 {$strRegKey += "0" + $tempString}
2 {$strRegKey += $tempString}
}
}
[byte[]] $bytTempAppPath = @()
$bytTempAppPath = $encText.GetBytes($ProgramName)
[byte[]] $bytAppPath = @()
$strAppPath = ""
Function Rot13($byteToRot)
{
if($byteToRot -gt 64 -and $byteToRot -lt 91)
{
$bytRot = $($($byteToRot - 64 + 13) % 26 + 64)
return $bytRot
}
elseif($byteToRot -gt 96 -and $byteToRot -lt 123)
{
$bytRot = $($($byteToRot - 96 + 13) % 26 + 96)
return $bytRot
}
else
{
return $byteToRot
}
}
for($x = 0; $x -lt $bytTempAppPath.Count * 2; $x++)
{
If($x % 2 -eq 0)
{
$curbyte = $bytTempAppPath[$([Int]($x / 2))]
$bytAppPath += Rot13($curbyte)
}
Else
{
$bytAppPath += 0
}
}
for($x=0; $x -lt $bytAppPath.Count; $x++)
{
$tempString = [Convert]::ToString($bytAppPath[$x], 16)
switch($tempString.Length)
{
0 {$strAppPath += "00"}
1 {$strAppPath += "0" + $tempString}
2 {$strAppPath += $tempString}
}
}
if(-not $strRegKey.Contains($strAppPath))
{
Write-Host Program not found. Programs are case sensitive.
break
}
[byte[]] $header = @()
$items = @{}
for($x=0; $x -lt 20; $x++)
{
$header += $bytRegKey[$x]
}
for($x=0; $x -lt $(($bytRegKey.Count-20)/1640); $x++)
{
[byte[]] $item=@()
$startingByte = 20 + ($x*1640)
$item += $bytRegKey[$($startingByte)..$($startingByte+1639)]
$items.Add($startingByte.ToString(), $item)
}
foreach($key in $items.Keys)
{
$item = $items[$key]
$strItem = ""
$tempString = ""
for($x=0; $x -le $item.Count; $x++)
{
$tempString = [Convert]::ToString($item[$x], 16)
switch($tempString.Length)
{
0 {$strItem += "00"}
1 {$strItem += "0" + $tempString}
2 {$strItem += $tempString}
}
}
if($strItem.Contains($strAppPath))
{
Write-Host Item Found with $ProgramName in item starting with byte $key
$bytRegKey[$([Convert]::ToInt32($key)+528)] = $setting
Set-ItemProperty $($(Get-Item 'HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify').PSPath) -name IconStreams -value $bytRegKey
}
}
Run Code Online (Sandbox Code Playgroud)
使用您选择的名称将其另存为 ps1 文件。
打开组策略管理 MMC。选择您选择的组策略对象,右键单击并选择编辑。在编辑器中,导航到用户配置 > Windows 设置 > 脚本 > 登录,然后单击“显示属性”。转到 PowerShell 选项卡,然后单击查看文件。
将刚刚制作的脚本复制到刚刚打开的资源管理器窗口中,然后关闭窗口。
在登录脚本属性窗口中,添加一个新的PowerShell脚本,在脚本名称中输入你使用的脚本名称(例如:NotifyIcon.ps1),然后在参数中输入程序名称(区分大小写!)通过设置使用:
0 = 只显示通知 1 = 隐藏图标和通知 2 = 显示图标和通知 <--- 您需要的
例如,如果您需要始终显示 RealVNC 服务器,您可以输入:
winvnc4.exe 2
作为参数
您可以通过几种不同的方式找到可执行文件的名称,例如打开“运行”对话框并键入msconfig
并查看启动程序、手动导航到安装目录C:\Program Files\{your program}
,或通过查看正在运行的程序来尝试匹配所需的程序任务管理器中的进程。10 次中有 9 次这将导致成功。
为了使其工作,用户必须事先运行该应用程序,然后正确注销,以便 explorer.exe 有机会将更新的通知区域历史记录写入注册表。在后续登录时,脚本应成功在历史记录中找到该程序,并将其设置更新为始终显示。
您也可以尝试从 PowerShell 提示符手动运行脚本进行调试,但您必须在运行之前终止 explorer.exe ('taskkill /f /im explorer.exe'),否则 explorer 将看不到您的更新,并将覆盖当它确实退出时。
我不相信这个过程。不是我写的,我只是找到了。剧本归功于 Micah Rowland。GPO 流程的功劳归功于 Geoff Kendal
归档时间: |
|
查看次数: |
66103 次 |
最近记录: |