2011-10-24 44 views
14

我如何我可以設置一個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 

是否有托盤類似的東西?或者有一個選擇我可以使用代碼明智的。

+0

通知區域圖標「始終可見」狀態是通過任務欄屬性對話框進行的用戶選擇。如果Windows公開了編程接口,我也會感到驚訝。 – Jon

+0

是的,通常我不會試圖強制它到用戶。但是他們製作的屏幕截圖並非被不活動的圖標窗口所覆蓋,這一點至關重要。 – Drake

+0

然後他們可以進入「自定義...」,並說他們希望這個圖標始終可見。 –

回答

7

不適用的代碼,只需指導用戶,使其始終顯示

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

但是你可以管理通過修改註冊表項

HKEY_Current_User\Software\Microsoft\Windows\CurrentVersion\Explorer\TrayNotify 

檢查this

+5

再一次,這是不正確的,因爲有些應用程序如comodo已將自己置於我的直接托盤區域,而沒有特別將它放在那裏,因此您不能認爲這是不可能的。你不知道或容忍這是另一回事,但不要讓聲稱是常見的誤解 – Drake

+0

如果是這樣的話......所有的軟件供應商都會這樣做並強制用戶看到他們的托盤圖標! –

+0

@Drake:我相信這裏的誤解是你的。你知道「決定顯示哪些圖標」算法的每一個細節嗎?如果你不這樣做,你怎麼能確定它是「始終顯示」的,尤其是當文學和常識不同意這種情況時? – Jon

5
破解它

通知區域圖標「始終可見」狀態是用戶通過任務欄屬性所做的選擇對話框。這是由相應的Windows團隊按照的設計決定將用戶自行決定的選項

由於這個原因,there is no programmatic interface允許您始終可見的圖標。甚至還有no interface to ask if your icon is visible or not

在你的鞋子裏,我只是設置了一個熱鍵,允許用戶在沒有涉及圖標的情況下截圖(所有屏幕截圖程序都這樣做)。

如果用戶在拍攝屏幕截圖之前確實喜歡右鍵單擊,則可以隨時通過上述任務欄屬性更改他們的偏好。

+1

它不是一種需要全局熱鍵的應用程序,它用於當他們想自願提供帶有錯誤報告的屏幕截圖以進行測試時。不得不記住或放棄一個特定的熱鍵組合,因爲它比在托盤上顯示更具侵入性。 – Drake

+0

@Drake:我不是說*強迫他們這樣做*。我在說「給他們這個選擇,它也會爲那些接受它的人解決當前的問題」。 – Jon

+2

他們確實有一個選項,如果他們不希望它在活動托盤列表中。他們總是可以將其拖入非活動狀態。但是默認情況下,他們應該能夠看到應用程序正在運行,並且隨時可以在需要時隨時發出命令。我已經可以想象人們試圖運行它的兩個實例,因爲他們看不到它是活躍的,或者最終忘記了它對他們可用。 – Drake

0

微軟已經明確採取了這樣的立場,即這是對用戶的決定,而不是以編程方式做出的決定。是的,圍繞這些內部攻擊有各種各樣的實用工具來實現這一點,但是沒有支持的方式來實現你的願望。

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[]] [email protected]() 
    $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

爲paramenters

你可以找到在幾個不同的方式,比如打開運行對話框並鍵入MSCONFIG,然後看着啓動程序,手動導航到安裝目錄C可執行文件的名稱:\ Program Files {您的程序},或嘗試通過查看任務管理器中正在運行的進程來匹配所需的程序。 10次​​中有9次會導致成功。

爲了使其工作,用戶必須先運行應用程序,然後正確註銷,以便explorer.exe有機會將更新的通知區域歷史記錄寫入註冊表。在後續登錄時,腳本應該成功在歷史記錄中找到該程序,並將其設置更新爲始終顯示。

您也可以嘗試從PowerShell提示符手動運行腳本進行調試,但在運行之前必須先殺死explorer.exe('taskkill/f/im explorer.exe'),否則explorer將不會看到您的更新,並在退出時覆蓋它。

我對這個過程沒有評價。我沒有寫,我只是找到它。對劇本的信貸轉交給Micah Rowland。 GPO流程的積分轉到傑夫肯德爾

沒有足夠的聲望鏈接到原作者,除了頂部的那個。

+1

@MthetheRR。謝謝,編輯。 – jparnell8839

0

使用類似此腳本的東西來增強軟件包,以便通過簡單的複選框,用戶可以決定是否將圖標固定到通知區域(不是),而不必跳過Microsoft選擇的各種箍環在可訪問性方面似乎是一個奇妙的想法。

也許,如果微軟在通知區域圖標(如任務欄)上提供了右鍵單擊pin/unpin選項,或者程序輕鬆提供此功能的能力,我們就不會進行此討論。