2011-10-24 9 views
14

Come posso Ho impostato un NotifyIcon per essere sempre visibile nella barra a destra: http://screensnapr.com/v/qKWHe2.pngSet icona del vassoio per mostrare sempre

perché sposta sopra nella finestra icona inattiva: http://screensnapr.com/v/jjtuK0.png

La questione è che l'icona del vassoio ha un menu contestuale che consente a qualcuno di scattare una schermata. Quindi, ogni volta che scattano uno screenshot, quella finestra di icona inattiva è nell'immagine, bloccando qualsiasi cosa ci sia dietro come un bombardiere fotografico.

So che è possibile farlo tramite il codice perché altre applicazioni come comodo l'hanno fatto senza dover trascinare e rilasciare l'icona lì. Per struggersi un collegamento alla barra delle applicazioni ho imparato che si imposta un collegamento in questa cartella:

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

C'è qualcosa di simile per il vassoio? O c'è un'opzione che posso usare il codice saggio.

+0

L'assegnazione dello stato di "sempre visibile" alle icone dell'area di notifica è una scelta effettuata dall'utente tramite la finestra di dialogo delle proprietà della barra delle applicazioni. Sarei sorpreso se Windows esponesse un'interfaccia programmatica ad esso. – Jon

+0

Sì, e normalmente non proverei a forzarlo sull'utente. Ma è fondamentale che facciano uno screenshot che non è coperto dalla finestra di icone inattiva. – Drake

+0

Quindi possono entrare in "Personalizza ..." e dire che vogliono che quell'icona sia sempre visibile. –

risposta

7
Non

applicabile dal codice, solo agli utenti di rendere mostrare sempre

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

Ma si riesce a incidere modificando una voce di registro

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

controllo this

+5

Ancora una volta, questo non è vero perché ci sono applicazioni come comodo che si sono messe nella mia area del vassoio immediatamente senza che me lo mettessi appositamente, quindi non puoi obiettare che è impossibile. Non lo sai o non lo condoni è un'altra questione, ma non fare affermazioni che sono idee sbagliate comuni – Drake

+0

se così fosse .. tutti i produttori di software lo faranno e impongono all'utente di vedere le loro icone del vassoio! –

+0

@Drake: Credo che l'equivoco sia tuo qui. Conosci tutti i dettagli dell'algoritmo "decidi quali icone vengono mostrate"? Se non lo fai, come puoi essere così sicuro che è "sempre mostrato", specialmente quando c'è letteratura e buon senso in disaccordo con questo? – Jon

5

L'assegnazione dello stato "sempre visibile" alle icone dell'area di notifica è una scelta che l'utente effettua attraverso le proprietà della barra delle applicazioni finestra di dialogo. Questa è una decisione progettuale fatta dal team di Windows appropriato nell'ordine per mettere questa scelta a discrezione dell'utente.

Per questo motivo, there is no programmatic interface che consente di rendere un'icona sempre visibile. C'è anche no interface to ask if your icon is visible or not.

Nei tuoi panni Ho appena creato un tasto di scelta rapida che consente all'utente di scattare screenshot senza essere coinvolto con l'icona (tutti i programmi di cattura schermo lo fanno).

Se l'utente desidera davvero fare clic con il pulsante destro del mouse prima di acquisire uno screenshot, può sempre modificare le proprie preferenze tramite le proprietà della barra delle applicazioni come sopra indicato.

+1

Non è un tipo di applicazione che richiede un tasto di scelta rapida globale, ma per quando si desidera fornire volontariamente una schermata con un rapporto di errore per il test. Dover memorizzare o rinunciare a una specifica combinazione di tasti di scelta rapida per questo è più intrusivo che non averlo semplicemente mostrato nel vassoio. – Drake

+0

@Drake: non sto dicendo * li costringono a fare questo *. Sto dicendo "dai loro la possibilità, e risolverà anche il tuo problema attuale per quelli che lo prendono". – Jon

+2

Hanno un'opzione, se non la desiderano nell'elenco dei vassoi attivi. Possono sempre trascinarlo in quella inattiva. Ma per impostazione predefinita dovrebbero essere in grado di vedere che l'applicazione è in esecuzione e che è pronta a prendere un comando ogni volta che ne hanno bisogno. Posso già immaginare le persone che provano a eseguire due istanze perché non riescono a vedere se sono attive o finiscono per dimenticare che sono disponibili per loro. – Drake

0

Microsoft ha esplicitamente preso posizione sul fatto che questa è una decisione per l'utente e non una che può essere programmata a livello di codice. Sì, ci sono varie utility in giro per l'interno per raggiungere questo obiettivo, ma non esiste un modo supportato per raggiungere ciò che desideri.

7

Stavo cercando online e in realtà ho trovato questo a caso.

Per farla breve, una combinazione di PowerShell (script fornito) e GPO.

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

lunga storia, creare uno script PowerShell contenente quanto segue:

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 
    } 
} 

Salva come file PS1 utilizzando il nome di vostra scelta.

Aprire MMC Gestione criteri di gruppo. Seleziona l'oggetto Criteri di gruppo scelto, fai clic con il tasto destro e seleziona Modifica. Nell'editor, accedere a Configurazione utente> Impostazioni di Windows> Script> Accesso e fare clic su "Proprietà dello schermo". Vai alla scheda PowerShell e fai clic su Visualizza file.

Copia lo script appena creato nella finestra di Esplora risorse appena aperta e quindi chiusa fuori dalla finestra.

Nella finestra delle proprietà dello script di accesso, aggiungere un nuovo script PowerShell, nel nome dello script, immettere il nome dello script utilizzato (esempio: NotifyIcon.ps1), quindi nei parametri, immettere il nome del programma (caso ! sensitive) seguita dalla impostazione per utilizzare:

0 = Mostra solo le notifiche 1 = nascondere icone e notifiche 2 = Mostra icona e notifiche < --- quello che vi serve

esempio, se avete bisogno di RealVNC server sempre visualizzato, immettere:

winvnc4.exe 2

le paramenters

È possibile trovare il nome del file eseguibile in un paio di modi diversi, come l'apertura di una finestra di dialogo Esegui e digitando msconfig e guardando i programmi di avvio, manualmente la navigazione verso la directory di installazione C : \ Programmi {il tuo programma}, o cercando di abbinare il programma desiderato osservando i processi in esecuzione in Task Manager. 9 volte su 10 questo si tradurrà in successo.

Affinché questo funzioni, l'utente deve aver eseguito in precedenza l'applicazione e quindi disconnesso correttamente, in modo che explorer.exe abbia la possibilità di scrivere la cronologia dell'area di notifica aggiornata nel Registro di sistema. In un accesso successivo, lo script dovrebbe localizzare con successo il programma nella cronologia e aggiornarne le impostazioni per visualizzarlo sempre.

Puoi anche provare a eseguire manualmente lo script da un prompt di PowerShell per eseguire il debug, ma DEVI uccidere explorer.exe ('taskkill/f/im explorer.exe') prima di eseguirlo, altrimenti explorer non vedrà il tuo aggiornamento e lo sovrascriverà quando smetterà.

Non prendo alcun merito per questo processo. Non l'ho scritto, l'ho appena trovato. Il merito per la sceneggiatura va a Micah Rowland. Il credito per il processo GPO va a Geoff Kendal

Non abbastanza reputazione da collegare agli autori originali, con l'eccezione di quello in alto.

+1

@MatthewR. Grazie, modificato. – jparnell8839

0

Utilizzare qualcosa come questo script per migliorare un pacchetto software in modo che con una semplice casella di controllo l'utente possa decidere se pin l'icona nell'area di notifica (o meno) senza dover passare attraverso i vari cerchi che Microsoft ha scelto di mettere in piedi sembra un'idea fantastica in termini di accessibilità.

Forse se Microsoft avesse offerto un'opzione di sblocco/clic del tasto destro sulle icone dell'area di notifica (come la barra delle applicazioni), o la possibilità per un programma di offrire facilmente tale funzione, non avremmo questa discussione.