将托盘图标设置为始终显示

Dra*_*ake 17 .net c# trayicon notifyicon winforms

如何将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
Run Code Online (Sandbox Code Playgroud)

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

Moh*_*bed 7

代码不适用,只是指示用户始终显示

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

但您可以通过修改注册表项来设法破解它

HKEY_Current_User\Software\Microsoft\Windows\CurrentVersion\Explorer\TrayNotify
Run Code Online (Sandbox Code Playgroud)

检查一下

  • 再说一遍,这不是真的,因为像comodo这样的应用程序已经将我们自己置于我的直接托盘区域而没有我专门将它放在那里所以你不能认为这是不可能的.你不知道或宽恕这是另一回事,但不要提出常见的误解 (5认同)
  • 看到这么多人站起来声称这是一个不可能的壮举,因为他们被错误地提供信息并将其视为事实,这只是令人恼火.我只是希望它在托盘中默认,而不是强制.只是默认. (2认同)
  • 默认值为“仅显示通知”。Explorer 尝试猜测该图标是否表示通知,有时这种猜测会产生误报,这就是您在其他程序中看到的情况。 (2认同)

jpa*_*839 7

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

简而言之,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
    }
}
Run Code Online (Sandbox Code Playgroud)

使用您选择的名称将其另存为ps1文件.

打开组策略管理MMC.选择所选的组策略对象,右键单击并选择"编辑".在编辑器中,导航到"用户配置">"Windows设置">"脚本">"登录",然后单击"显示属性".转到PowerShell选项卡,然后单击"查看文件".

将刚刚创建的脚本复制到刚打开的资源管理器窗口中,然后关闭窗口.

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

0 =仅显示通知1 =隐藏图标和通知2 =显示图标和通知<---您需要的那个

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

winvnc4.exe 2

作为参数

你可以找出一对夫妇不同的方式,比如打开运行对话框并键入MSCONFIG,然后看着启动程序,手动导航到安装目录C可执行文件的名称:\ Program Files文件{程序},或尝试通过查看任务管理器中正在运行的进程来匹配所需的程序.10次​​中的9次将导致成功.

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

您也可以尝试从PowerShell提示符调试手动运行该脚本,但你必须杀死Explorer.exe的("的taskkill/F/IM的explorer.exe")运行它之前,否则Explorer将不会看到您的更新,并覆盖当它退出时它.

我不赞成这个过程.我没有写它,我刚刚发现它.该剧本归功于Micah Rowland.GPO流程归功于Geoff Kendal

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


Jon*_*Jon 6

通知区域图标"始终可见"状态是用户通过任务栏属性对话框进行的选择.这是由适当的Windows团队做出的设计决策,以便由用户自行决定是否做出此选择.

因此,没有程序界面允许您使图标始终可见.甚至没有可以询问您的图标是否可见的界面.

在你的鞋子里,我只需设置一个热键,允许用户截取屏幕截图而不涉及图标(所有屏幕捕获程序都这样做).

如果用户在拍摄屏幕截图之前确实喜欢右键单击,他们可以随时通过任务栏属性更改其偏好,如上所述.

  • 如果他们不想在活动托盘列表中,他们有一个选项.他们总是可以将其拖入非活动状态.但默认情况下,他们应该能够看到应用程序正在运行,并且可以随时在需要时获取命令.我已经可以想象人们试图运行它的两个实例,因为他们无法看到它是活动的,或者最终忘记它可用于它们. (2认同)