Зробіть так, щоб певний значок лотка завжди відображався для всіх профілів у Windows 7


13

Я налаштовую машину Windows 7, яка буде сидіти на відкритому повітрі і нею поділяться багато людей. Я додав ярлик до меню "Пуск" для всіх користувачів, щоб запустити програму, яка знаходиться в системному треї. Я хочу, щоб піктограма лотка для цієї програми завжди була видно за замовчуванням, незалежно від того, хто входить в систему. Користувач може вимкнути його у своєму профілі, якщо він дійсно хоче, але мені це потрібно, щоб принаймні почати встановлювати, як завжди видно. Як я можу це зробити?

Я вважаю за краще не показувати всі іконки, частково з тієї ж причини, що вони приховані в першу чергу: я не хочу безладу. Крім того, оскільки це публічний комп'ютер, є ще одна програма під назвою DeepFreeze, яка також має піктограму системного трея, і я не хочу, щоб ця іконка відображалася весь час.


Ви не можете показати значок / повідомлення іншим механізмом, ніж у системному треї?
jalf

Відповіді:


11

Наразі в горіховій оболонці цього зробити не можна.

Немає групової політики або налаштувань, щоб встановити це, і спосіб його відстеження робить його специфічним для поточного користувача та системи, завдяки чому "налаштування" сильно відрізняються від конкретного випадку до конкретного.

Вони зберігаються тут (в реєстрі) , якщо ви хочете , щоб перевірити це: HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify.

Від сюди :

Немає можливості, щоб додатки програмно завжди демонстрували себе на найвищому рівні в системному лотку при першому встановленні або в будь-який час під час виконання. Це одна з декількох змін, які ми внесли в Windows 7, намагаючись створити чистіший і тихіший робочий стіл, який знаходиться під контролем користувача, щоб налаштувати верхній рівень за своїми улюбленими програмами та піктограмами.

Ми тримаємо користувача під контролем області сповіщень, не допускаючи програмного просування (крім тимчасового або для показу сповіщення). Якщо припустити, що машина є достатньо тихою, коли ви вперше додасте свій значок із Shell_NotifyIcon (NIM_ADD, ...), він буде відображатися на панелі завдань протягом 45 секунд, а потім переходити до переповнення. Якщо користувач рекламує піктограму, вона завжди відображатиметься на панелі завдань. Якщо користувач демонструє це, піктограма ніколи не побачиться на панелі завдань. Будь-яку акцію потрібно ініціювати користувачем. Ми зробили це набагато простіше в Windows 7 за допомогою перетягування та перемикання через панель управління Іконами області повідомлень, і те, що ми бачили в дослідженнях зручності використання та на основі бета-зворотного зв’язку, - це те, що користувачі не мають труднощів розкрити, як налаштувати поведінку сповіщень. і рекламуватимуть значки, до яких хочеться швидкого доступу.

Ваша найпростіша ставка - показати ВСІ іконки області повідомлень для всіх користувачів. Це можна зробити, додавши (простий) запис реєстру:

В HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorerстворити нове значення DWORD з ім'ям EnableAutoTrayі встановити його , 0щоб вимкнути повідомлення району «автоскритіе» риси.

З певною конфігурацією OU та сценаріями ви можете використовувати його і в контексті HKCU, якщо ви хочете, щоб це сталося лише для певних користувачів / груп.

Дивіться тут для отримання додаткової інформації про це.


Я б краще не показав усіх іконок, але, якщо треба.
Joel Coehoorn

10

Я шукав в Інтернеті і фактично знайшов це випадковим чином.

Короткий короткий опис, комбінація 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}або намагатися відповідати потрібній програмі, переглянувши запущену програму процеси в диспетчері завдань. 9 разів з 10 це призведе до успіху.

Для того, щоб це працювало, користувач повинен попередньо запустити програму, а потім належним чином вийти з системи, так що explorer.exe отримає можливість записати оновлену історію області повідомлень до Реєстру. При наступному вході сценарій повинен успішно знаходити програму в історії та оновлювати її налаштування, щоб завжди відображався.

Ви також можете спробувати запустити скрипт вручну з підказки PowerShell для налагодження, але ОБОВ'ЯЗКОВО вбити explor.exe ('taskkill / f / im explorer.exe') перед його запуском, інакше провідник не побачить ваше оновлення, і перезаписать це коли він кине.

Я не беру на себе кредиту за цей процес. Я цього не писав, я просто знайшов. Заслуга сценарію припадає на Міхе Роуленда . Кредит на процес GPO припадає на Джеффа Кендала


Я на деякий час виходжу з офісу, і до моменту повернення я забув про це. Якщо ви зможете @відповісти цей коментар наприкінці наступного тижня, я зможу детальніше ознайомитися і, можливо, переключити прийняту відповідь.
Joel Coehoorn

Відповіді лише на посилання - ні-ні через можливу майбутню гниття посилань. Будь ласка, включіть у відповідь відповідну інформацію. Нас також не хвилює, чи відповіли ви на старе запитання, це насправді ДОБРА річ, тому, будь ласка, подумайте про видалення "вибачення" та причин для публікації. :)
Ƭᴇcʜιᴇ007

@ techie007 Дякую, відредагував @ Joel Coehoorn Я опублікую наліпки, щоб нагадати мені: P
Джошуа Парнелл

@JoelCoehoorn Ось ваша @ відповідь. Вибачте, пройшло так багато часу, слюд забув про це.
Джошуа Парнелл

Він працює добре, але працює дуже повільно: для мого розумного швидкого ПК потрібно 20 секунд.
Mozzis

4

Я не знаю, чи можна встановити порядок кешування для піктограм, вважаючи, що він може постійно змінюватися, якщо нові програми додаються, але ви можете встановити сповіщення на "Завжди показувати всі значки та сповіщення на панелі завдань".

Щоб встановити це за замовчуванням, перейдіть до цього ключа реєстру:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer

Додайте значення " EnableAutoTray" DWORD " ", двічі клацніть його та встановіть шістнадцяткове значення " 0".

Я перевірив це, і це спрацювало.

Цікава примітка: я спершу спробував додати її до цього ключа:

HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer

Я завжди думав, що це реєстр за замовчуванням для нових користувачів, але це не спрацювало. Тож я пішов шукати та знайшов цю цікаву статтю, що переслідує мої давні думки щодо цього ключа .DEFAULT.

http://blogs.msdn.com/b/oldnewthing/archive/2007/03/02/1786493.aspx

Доповнення: Найкраще, що я можу сказати, це те, що записи реєстру знаходяться тут. Якщо ви збиралися спробувати встановити одну піктограму так, як і якщо б ви відкрили " Control Panel\All Control Panel Items\Notification Area Icons":

HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify

Якщо ви подивитесь на них, вони не дуже зрозумілі, тому я не впевнений, наскільки добре ви би зробили їх редагування.

Я пропоную вам розглянути можливість створення нового користувача та його профілю, встановіть для цієї піктограми (принаймні) "Показати піктограму та повідомлення" "Панель управління \ Усі елементи панелі керування \ Іконки області повідомлень".

Потім перезавантажте, щоб випустити профіль, і увійдіть як адміністратор. Скопіюйте цей профіль у C:\Users\Defaultпрофіль. Це можна зробити або вручну за допомогою Провідника, або як ми це робили в " Control Panel\All Control Panel Items\System" " Advanced System Settings>Advanced>User Profiles>Copy to". Він буде сірим, але ви можете скористатися програмою Windows Enabler .


Я б краще не показав усіх іконок, але, якщо треба.
Joel Coehoorn

Я збираюся додати відповідь.
KCotreau

Я бачив Windows Enabler та інші рішення для копіювання профілів, але експерименти показали, що це справді зламано для Windows 7. Мені це сумно :(
Joel Coehoorn,

Я погоджуюся, Джоель, ЧОМУ вони б відключили цю функцію? Я досі не маю ідеї, окрім людей, які намагаються скопіювати її в неправильне місце.
KCotreau

@KCotreau: Це було в блогах Windows Deployment. Це має відношення до певних операцій, які відбуваються лише під час створення профілю, тобто "Підготовка робочого столу." Відверто кажучи, це відстійно, але я бачу, чому вони намагаються відійти всіх від цього методу. Просто непередбачувано, якими будуть кінцеві результати.
surfasb

1

Запустити це як адміністратор:

Set-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer EnableAutoTray 0

Зверніть увагу на HKLM замість HKCU .

Підтвердьте ефект за допомогою:

ps explorer | kill

Він показує всі піктограми для всіх профілів.


1
#this will grab all the SID on current user and apply across all.
Function Enable-Notifications
{
    Param
        (
        [parameter(Mandatory=$false)][string]$cpuName
        )


        if (Test-Connection $cpuName -Quiet)    
        {
Try
                {
                    $serviceName = "Remote Registry"  
                    Get-Service -ComputerName $cpuName -Name $serviceName | Start-Service
                }
                Catch
                {
                    Write-Host "Possible Error restarting $serviceName on $cpuName" -ForegroundColor Red
                }
                Try
                {
                    $root = [Microsoft.Win32.RegistryHive]::Users
                    $regKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($root, $cpuName)

                    $users = $regKey.GetSubKeyNames() | where { $_.Length -gt 10 -and $_.EndsWith("_Classes") -eq $false }
                    foreach ($usersid in $users)
                    {
                        $key = "$usersid\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer"
                        $regKey = $regKey.OpenSubKey($key, $true)
                        $regKey.SetValue("EnableAutoTray", "0", 'DWORD')
                    }
                    $ActiveUser = ([Environment]::UserDomainName + "\" + [Environment]::UserName)
                    $Time = Get-Date -format "MM-dd-yyyy @ HH:mm"
                    $WriteOut = "$ActiveUser enabled Notifcations on $cpuName at $Time"
                    $WriteOut >> "c:\scripts\Notification-Update-Enable.csv"
                    Write-Host "Enable Notifications on $cpuName" -ForegroundColor Green
                }       
                Catch
                {
                    $errormsg = $cpuName + ” is down/not responding.”
                    Write-Host $errorMsg -ForegroundColor Red
                    $errormsg >> "c:\scripts\Notification-Update-Enable_Off.csv"
                }
}
        else
        {
            Write-Host "$cpuName is Offline. Try again later." -ForegroundColor Red
            $errormsg >> "c:\scripts\Notification-Update-Enable_Off.csv"
        }
}

FYI є обгортка формату блоку коду, тому вам не доведеться використовувати <br>в кожному рядку.
Енігма

0

вона доступна в наступних версіях групової політики, див. варіант B

Усі ці варіанти доступні в User Configuration\Administrative Templates\Start Menu and Taskbar

Ви можете:

A) Вимкніть його повністю або включити його повністю ( «приховати область повідомлень,» працює як для XP і 7)

B) Майте це показати все, або продовжують показувати значки користувач вказує ( "вимкнути області повідомлень очищення, "працює як для XP, так і для 7)

C) Вимкнення лише певних піктограм, включених у групову групу за замовчуванням, таких як Центр дій, Мережа, Вимір акумулятора, Гучність. Наскільки я можу сказати, це єдині 4 піктограми області сповіщень, з якими можна працювати за допомогою типового GPO 2008R2 за замовчуванням (і вони працюють лише для Vista та вище або 7 та вище).


1
Тож те, про що я запитав, недоступне через групову політику, оскільки я хочу примусити певний значок завжди показувати, і це не один із варіантів GPO, описаних тут.
Джоел Куехорн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.