簡體   English   中英

將托盤圖標設置為始終顯示

[英]Set tray icon to always show

如何將 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。 選擇您選擇的組策略對象,右鍵單擊並選擇編輯。 在編輯器中,導航到“用戶配置”>“ 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 /imexplorer.exe'),否則Explorer將看不到您的更新,並且將覆蓋它確實退出時。

我對此過程不屑一顧。 我沒有寫,只是找到了。 腳本的貢獻歸功於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

檢查這個

用戶可以通過任務欄屬性對話框將通知區域圖標設置為“始終可見”。 這是由相應的Windows團隊做出的設計決定,以便用戶自行選擇

因此, 沒有編程界面可讓您使圖標始終可見。 甚至沒有界面詢問您的圖標是否可見

在您的鞋子中,我只是設置了一個熱鍵,該鍵允許用戶截取屏幕快照而完全不涉及圖標(所有屏幕捕獲程序都這樣做)。

如果用戶確實喜歡在截屏前右鍵單擊,則可以始終通過上述任務欄屬性來更改其首選項。

使用類似於此腳本的內容來增強軟件包,以便用戶可以通過一個簡單的復選框來決定是否將圖標固定到通知區域(而不必),而不必跳過Microsoft選擇放置的各種方式。就可訪問性而言,這似乎是一個很棒的主意。

也許,如果Microsoft在通知區域圖標(如任務欄)上提供了右鍵單擊固定/取消固定選項,或者程序是否能夠輕松提供此類功能,我們將不在此討論。

我在一個應用程序中遇到了這個問題,並花了很多精力尋找解決方案。

此解決方案可讓您固定應用程序的托盤圖標。 它確實需要本地管理員權限或本地系統權限。

此解決方案不需要您重新啟動 explorer.exe。 用 C# 或其他語言固定托盤圖標

Microsoft明確表示這是用戶的決定,而不是可以通過編程方式做出的決定。 是的,內部有各種各樣的工具可以達到此目的,但是沒有支持的方法可以實現您想要的目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM