c# - Establecer icono de bandeja para mostrar siempre
notifyicon c# (5)
¿Cómo puedo configurar un NotifyIcon para que esté siempre visible en la bandeja derecha? http://screensnapr.com/v/qKWHe2.png
porque lo desplaza a la ventana de icono inactiva: http://screensnapr.com/v/jjtuK0.png
El problema es que el icono de la bandeja tiene un menú contextual que le permite a alguien tomar una captura de pantalla. Así que cada vez que toman una captura de pantalla, esa ventana de ícono inactiva está en la imagen, bloqueando todo lo que está detrás de ella como un bombardero fotográfico.
Sé que es posible hacerlo a través del código porque otras aplicaciones como comodo lo han hecho sin tener que arrastrar y soltar el ícono allí. Para forzar un acceso directo a la barra de tareas, aprendí que configuraste un acceso directo en esta carpeta:
C:/Users/Username/AppData/Roaming/Microsoft/Internet Explorer/Quick Launch/User Pinned/TaskBar
¿Hay algo similar para la bandeja? O hay una opción que puedo usar código sabio.
Dar a los iconos del área de notificación el estado "siempre visible" es una opción que el usuario realiza a través del cuadro de diálogo de propiedades de la barra de tareas. Esta es una decisión de diseño tomada por el equipo de Windows apropiado para poder hacer esta elección a discreción del usuario .
Por esta razón, http://blogs.msdn.com/b/oldnewthing/archive/2010/12/15/10105142.aspx que le permita hacer que un ícono esté siempre visible. Incluso no hay interfaz para preguntar si su icono es visible o no .
En sus zapatos, acabo de configurar una tecla de acceso rápido que le permite al usuario tomar capturas de pantalla sin involucrarse con el icono (todos los programas de captura de pantalla lo hacen).
Si al usuario realmente le gusta hacer clic derecho antes de tomar una captura de pantalla, siempre puede cambiar sus preferencias a través de las propiedades de la barra de tareas como se mencionó anteriormente.
Estaba buscando en línea y en realidad encontré esto al azar.
En pocas palabras, una combinación de PowerShell (secuencia de comandos incluida) y GPO.
Larga historia, crea un script de PowerShell que contenga lo siguiente:
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
}
}
Guárdelo como un archivo ps1 usando el nombre de su elección.
Abre el MMC de Gestión de Políticas de Grupo. Seleccione el objeto de directiva de grupo elegido, haga clic con el botón derecho y seleccione Editar. En el editor, vaya a Configuración de usuario> Configuración de Windows> Secuencias de comandos> Inicio de sesión y haga clic en "Propiedades de pantalla". Vaya a la pestaña de PowerShell y haga clic en Ver archivos.
Copie la secuencia de comandos que acaba de crear en la ventana del Explorador que se acaba de abrir y luego cierre la ventana.
En la ventana de propiedades del script de inicio de sesión, agregue un nuevo script de PowerShell, en el nombre del script, ingrese el nombre del script que utilizó (ejemplo: NotifyIcon.ps1), y luego en los parámetros, ingrese el nombre del programa (¡distingue entre mayúsculas y minúsculas) seguido de por la configuración a utilizar:
0 = mostrar solo notificaciones 1 = ocultar icono y notificaciones 2 = mostrar icono y notificaciones <--- el que necesita
Por ejemplo, si necesita que el servidor RealVNC aparezca siempre, debe ingresar:
winvnc4.exe 2
como los paramenters
Puede averiguar el nombre del ejecutable de dos maneras diferentes, como abrir un cuadro de diálogo Ejecutar y escribir msconfig y mirar los programas de inicio, navegar manualmente al directorio de instalación C: / Archivos de programa {su programa}, o probar para que coincida con el programa deseado mirando los procesos en ejecución en el Administrador de tareas. 9 de cada 10 resultados resultarán en éxito.
Para que esto funcione, el usuario debe haber ejecutado previamente la aplicación y luego haber cerrado la sesión correctamente, para que explorer.exe tenga la oportunidad de escribir el historial del área de notificación actualizada en el Registro. En un inicio de sesión posterior, la secuencia de comandos debe ubicar con éxito el programa en el historial y actualizar su configuración para que siempre se muestre.
También puede intentar ejecutar el script manualmente desde un indicador de PowerShell para depurar, pero DEBE eliminar explorer.exe (''taskkill / f / im explorer.exe'') antes de ejecutarlo, de lo contrario el explorador no verá su actualización y sobrescribirá cuando lo hace dejar de fumar.
No tomo crédito por este proceso. No lo escribí, simplemente lo encontré. El crédito por el guión es para Micah Rowland. Crédito para el proceso de GPO va a Geoff Kendal
No hay suficiente reputación para vincular a los autores originales, con la excepción de uno en la parte superior.
Microsoft ha adoptado explícitamente la postura de que esta es una decisión para el usuario y no una que se pueda tomar mediante programación. Sí, hay varias utilidades alrededor que hackean las partes internas para lograr esto, pero no hay una forma compatible de lograr lo que deseas.
No es aplicable por código, solo instruye a los usuarios para que lo muestren siempre
http://blogs.msdn.com/b/oldnewthing/archive/2010/12/15/10105142.aspx
Pero puedes administrar para hackearlo modificando una entrada de registro
HKEY_Current_User/Software/Microsoft/Windows/CurrentVersion/Explorer/TrayNotify
mira this
Usar algo como este script para mejorar un paquete de software de modo que con una simple casilla de verificación el usuario pueda decidir si coloca el ícono en el área de notificación (o no) sin tener que saltar a través de los diversos aros que Microsoft ha elegido poner en el camino. Parece una idea fantástica en términos de accesibilidad.
Tal vez si Microsoft hubiera ofrecido una opción de pinchar / desenclavar con el botón derecho en los íconos del área de notificación (como la barra de tareas), o la capacidad de un programa para ofrecer fácilmente esa característica, no tendríamos esta discusión.