设置托盘图标总是显示

本文关键字:显示 置托盘图标 | 更新日期: 2023-09-27 18:12:07

如何设置NotifyIcon在右侧托盘中始终可见:http://screensnapr.com/v/qKWHe2.png

,因为它将它移动到非活动图标窗口:http://screensnapr.com/v/jjtuK0.png

问题是托盘图标有一个上下文菜单,让人可以截图。所以每次他们截图的时候,那个不活跃的图标窗口就在图片中,像一个照片轰炸机一样挡住了它后面的东西。

我知道可以通过代码来完成,因为其他应用程序(如comodo)已经完成了,而不需要我将图标拖放到那里。要在任务栏上添加快捷方式,我了解到您可以在此文件夹中设置快捷方式:

C:'Users'Username'AppData'Roaming'Microsoft'Internet Explorer'Quick Launch'User Pinned'TaskBar

托盘有类似的东西吗?或者有一个选项,我可以使用代码明智。

设置托盘图标总是显示

我在网上搜索,实际上是随机发现的。

长话短说,PowerShell(脚本提供)和GPO的组合。

http://4sysops.com/archives/forcing-notification-area-icons-to-always-show-in-windows-7-or-windows-8/

说来话长,创建一个包含以下内容的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
    }
}

保存为ps1文件,使用您选择的名称。

打开组策略管理MMC。选择您选择的组策略对象,右键单击并选择编辑。在编辑器中,导航到User Configuration> Windows Settings> Scripts> Logon,然后单击"Display Properties"。进入PowerShell选项卡,点击查看文件。

将刚才编写的脚本复制到刚刚打开的资源管理器窗口中,然后关闭窗口。

在登录脚本属性窗口中,添加一个新的PowerShell脚本,在脚本名称中输入您使用的脚本的名称(例如:NotifyIcon.ps1),然后在参数中输入程序名称(区分大小写!),后面跟着要使用的设置:

0 =只显示通知1 =隐藏图标和通知2 =显示图标和通知<——你需要的那个

示例,如果您需要RealVNC服务器始终显示,您可以输入:

winvnc4.exe 2

作为参数

您可以通过几种不同的方式找到可执行文件的名称,例如打开运行对话框并输入msconfig并查看启动程序,手动导航到安装目录C:'Program Files{您的程序},或者通过查看任务管理器中正在运行的进程来尝试匹配所需的程序,这十有九会成功。

为了使此工作,用户必须先前运行应用程序,然后正确地注销,以便explorer.exe有机会将更新的通知区域历史记录写入注册表。在后续登录时,脚本应该成功地在历史记录中找到该程序,并将其设置更新为始终显示。

你也可以尝试从PowerShell提示符手动运行脚本来调试,但是你必须在运行它之前杀死explorer.exe (' taskkill/f/im explorer.exe '),否则浏览器将看不到你的更新,并且在退出时将覆盖它。

这个过程我没有功劳。不是我写的,是我发现的。剧本的作者是Micah Rowland。GPO流程的功劳归于Geoff Kendal

没有足够的声誉链接到原作者,除了顶部的那个。

代码不适用,只需指示用户使其始终显示

http://blogs.msdn.com/b/oldnewthing/archive/2010/12/15/10105142.aspx

但是你可以通过修改注册表项来破解它

HKEY_Current_User'Software'Microsoft'Windows'CurrentVersion'Explorer'TrayNotify

check this

将通知区域图标设置为"always visible"状态是用户通过任务栏属性对话框做出的选择。这是由适当的Windows团队做出的设计决定,以便让用户自行选择

由于这个原因,没有可编程接口允许您使图标始终可见。甚至没有界面来询问你的图标是否可见。

站在你的立场上,我会设置一个热键,让用户可以在不涉及图标的情况下进行屏幕截图(所有的屏幕截图程序都这样做)。

如果用户真的喜欢在截图前右键,他们可以通过上面提到的任务栏属性来改变他们的偏好。

使用像这样的脚本来增强软件包,这样用户就可以通过一个简单的复选框来决定是否将图标固定在通知区域,而不必跳过微软选择的各种障碍,这在可访问性方面似乎是一个很棒的想法。

如果微软在通知区域图标(如任务栏)上提供右击固定/取消固定选项,或者让程序轻松提供这样的功能,我们就不会有这个讨论了。

微软明确表示,这是用户的决定,而不是可以通过编程做出的决定。是的,有各种各样的工具可以在内部实现这一点,但是没有支持的方法来实现你想要的。