Установить значок в трее, чтобы всегда показывать

Как я могу установить 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

Есть ли что-то подобное для лотка? Или есть вариант, я могу использовать код мудрый.

Ответы

Ответ 1

Не применимо к коду, просто дайте указания пользователям всегда показывать

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

Но вы можете взломать его, изменив запись в реестре

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

проверить this

Ответ 2

Я искал онлайн и на самом деле нашел это случайно.

Короче говоря, комбинация PowerShell (script) и GPO.

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

Расскажите, создайте PowerShell script, содержащий следующее:

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, используя имя по вашему выбору.

Откройте консоль управления групповыми политиками. Выберите выбранный объект групповой политики, щелкните правой кнопкой мыши и выберите "Изменить". В редакторе выберите "Конфигурация пользователя" > "Настройки Windows" > "Сценарии" > "Вход в систему" ​​и нажмите "Свойства экрана". Перейдите на вкладку PowerShell и нажмите "Просмотр файлов".

Скопируйте script, который вы только что внесли в окно проводника, которое только что открылось и затем закрылось из окна.

В окне свойств входа script добавьте новый PowerShell script в имя script, введите имя используемого script (пример: NotifyIcon.ps1), а затем в параметрах, введите имя программы (с учетом регистра!), за которой следует настройка:

0 = показывать только уведомления 1 = скрывать значок и уведомления 2 = показывать значок и уведомления < --- тот, который вам нужен

Например, если вам нужно, чтобы сервер RealVNC всегда отображался, вы должны ввести:

winvnc4.exe 2

в качестве аргументов

Вы можете узнать имя исполняемого файла несколькими разными способами, например, открыть диалоговое окно "Запуск" и ввести "msconfig" и посмотреть программы запуска, вручную перейдя в каталог установки C:\Program Files {your program}, или пытается сопоставить желаемую программу, просмотрев запущенные процессы в диспетчере задач. В 9 раз из 10 это приведет к успеху.

Чтобы это работало, пользователь должен был предварительно запустить приложение, а затем правильно выйти из системы, чтобы explorer.exe получил возможность записать обновленную историю области уведомлений в реестр. При последующем входе в систему script должен успешно найти программу в истории и обновить ее настройку, чтобы всегда показывать.

Вы также можете попробовать запустить script вручную из приглашения PowerShell для отладки, но вы ДОЛЖНЫ убить explorer.exe('taskkill/f/im explorer.exe) перед запуском, иначе explorer не увидит ваше обновление и перезапишет его, когда он уйдет.

Я не беру на себя ответственность за этот процесс. Я не писал это, я просто нашел его. Кредит для script идет на Мика Роуленд. Кредит для процесса GPO относится к Джеффу Кендалу

Недостаточно репутации для ссылки на оригинальных авторов, за исключением того, что находится наверху.

Ответ 3

Предоставление значка области уведомлений "всегда видимый" статус - это выбор, который пользователь выполняет через диалог свойств панели задач. Это дизайнерское решение, сделанное соответствующей командой Windows, чтобы сделать выбор по усмотрению пользователя.

По этой причине отсутствует программный интерфейс, который позволяет сделать значок всегда видимым. Там даже нет интерфейса, чтобы спросить, отображается ли ваш значок или нет.

В твоих ботинках я просто установил горячую клавишу, которая позволяет пользователю делать скриншоты, не затрагивая значок вообще (все программы захвата экрана делают это).

Если пользователю действительно нравится щелкнуть правой кнопкой мыши, прежде чем делать снимок экрана, они всегда могут изменить свои предпочтения с помощью свойств панели задач, как указано выше.

Ответ 4

Microsoft прямо взяла на себя позицию, что это решение для пользователя, а не одно, которое можно сделать программным путем. Да, для достижения этой цели существуют различные утилиты, связанные с этим взломом, но нет надежного способа достижения желаемого.

Ответ 5

Используя что-то вроде этого script, чтобы улучшить пакет программного обеспечения, чтобы с помощью простого флажка пользователь мог решить, привязывать ли значок к области уведомлений (или нет), не перепрыгивая через различные обручи, выбранные Microsoft чтобы помешать на пути, кажется фантастической идеей с точки зрения доступности.

Может быть, если бы Microsoft предложила иконку правой кнопки мыши/отменить на значках области уведомлений (например, на панели задач) или возможность для программы легко предложить такую ​​функцию, мы не будем обсуждать этот вопрос.