Tạo biểu tượng khay cụ thể luôn hiển thị cho tất cả các cấu hình trong Windows 7


12

Tôi đang thiết lập một máy Windows 7 sẽ hoạt động ngoài trời và được nhiều người chia sẻ. Tôi đã thêm một phím tắt cho tất cả người dùng bắt đầu menu để chạy một chương trình nằm trong khay hệ thống. Tôi muốn biểu tượng khay cho chương trình này luôn hiển thị theo mặc định, bất kể ai đăng nhập. Người dùng có thể tắt nó trong hồ sơ của họ nếu họ thực sự muốn, nhưng tôi cần ít nhất là bắt đầu thiết lập như mọi khi. Tôi có thể làm cái này như thế nào?

Tôi thà không hiển thị tất cả các biểu tượng, một phần vì lý do tương tự chúng bị ẩn ở vị trí đầu tiên: Tôi không muốn sự lộn xộn. Ngoài ra, vì đây là một máy tính công cộng nên có một chương trình khác có tên DeepFreeze đang chạy cũng có biểu tượng khay hệ thống và tôi không muốn biểu tượng đó hiển thị mọi lúc.


Bạn không thể hiển thị biểu tượng / tin nhắn bằng một số cơ chế khác ngoài khay hệ thống?
jalf

Câu trả lời:


11

Trong một vỏ hạt, hiện tại, bạn không thể làm điều này.

Không có Chính sách nhóm hoặc Tùy chọn nào để đặt điều này và cách nó theo dõi làm cho nó cụ thể đối với người dùng hiện tại và hệ thống, làm cho 'cài đặt' thay đổi rất nhiều tùy theo từng trường hợp.

Chúng được lưu trữ ở đây (trong sổ đăng ký) nếu bạn muốn kiểm tra xem : HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify.

Từ đây :

Không có cách nào để các ứng dụng lập trình luôn hiển thị mức cao nhất trên khay hệ thống trong lần cài đặt đầu tiên hoặc bất cứ lúc nào trong thời gian chạy. Đây là một trong một số thay đổi mà chúng tôi đã thực hiện trong Windows 7 trong nỗ lực tạo ra một máy tính để bàn sạch hơn, yên tĩnh hơn trong tầm kiểm soát của người dùng để tùy chỉnh cấp cao nhất với các ứng dụng và biểu tượng yêu thích của họ.

Chúng tôi giữ cho người dùng kiểm soát khu vực thông báo bằng cách không cho phép quảng cáo theo chương trình (trừ tạm thời hoặc để hiển thị thông báo). Giả sử máy đủ yên tĩnh, khi bạn lần đầu tiên thêm biểu tượng của mình bằng Shell_NotifyIcon (NIM_ADD, ...), nó sẽ được hiển thị trên thanh tác vụ trong 45 giây, sau đó di chuyển vào tràn sau đó. Nếu người dùng quảng cáo một biểu tượng, nó sẽ luôn nằm trên thanh tác vụ. Nếu người dùng hạ cấp nó, biểu tượng sẽ không bao giờ được nhìn thấy trên thanh tác vụ. Bất kỳ khuyến mãi cần phải được bắt đầu người dùng. Chúng tôi đã làm điều này dễ dàng hơn nhiều trong Windows 7 thông qua kéo / thả và thông qua bảng điều khiển Biểu tượng khu vực thông báo và những gì chúng tôi đã thấy trong các nghiên cứu về khả năng sử dụng và dựa trên phản hồi beta, là người dùng không gặp khó khăn khi khám phá cách tùy chỉnh hành vi thông báo và sẽ quảng bá các biểu tượng mà họ muốn truy cập nhanh.

Về đặt cược dễ nhất của bạn là hiển thị TẤT CẢ các biểu tượng Khu vực thông báo cho tất cả người dùng. Điều này có thể được thực hiện bằng cách thêm một mục đăng ký (đơn giản):

Khi HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorertạo một giá trị DWORD mới được đặt tên EnableAutoTrayvà đặt nó để 0tắt các tính năng 'tự động ẩn' của Khu vực thông báo.

Với một số cấu hình và kịch bản OU, bạn cũng có thể sử dụng nó trong ngữ cảnh HKCU, nếu bạn chỉ muốn nó xảy ra với một số người dùng / nhóm nhất định.

Xem ở đây để biết thêm về điều đó.


Tôi thà không hiển thị tất cả các biểu tượng, nhưng tôi sẽ làm nếu tôi phải.
Joel Coehoorn

10

Tôi đã tìm kiếm trực tuyến và thực sự tìm thấy điều này một cách ngẫu nhiên.

Câu chuyện dài, sự kết hợp giữa PowerShell (kịch bản được cung cấp) và GPO.

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

Câu chuyện dài, tạo tập lệnh PowerShell chứa các mục sau:

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

Lưu nó dưới dạng tệp ps1 bằng tên bạn chọn.

Mở MMC quản lý chính sách nhóm. Chọn Đối tượng chính sách nhóm đã chọn của bạn, nhấp chuột phải và chọn Chỉnh sửa. Trong trình chỉnh sửa, điều hướng đến Cấu hình người dùng> Cài đặt Windows> Tập lệnh> Đăng nhập và nhấp vào "Thuộc tính hiển thị". Chuyển đến tab PowerShell và nhấp vào Xem tệp.

Sao chép tập lệnh bạn vừa thực hiện vào cửa sổ Explorer vừa mở và sau đó đóng cửa sổ.

Trong cửa sổ thuộc tính tập lệnh đăng nhập, thêm tập lệnh PowerShell mới, trong tên tập lệnh, nhập tên tập lệnh bạn đã sử dụng (ví dụ: NotifyIcon.ps1), sau đó trong tham số, nhập tên chương trình (phân biệt chữ hoa chữ thường!) theo cài đặt để sử dụng:

0 = chỉ hiển thị thông báo 1 = biểu tượng ẩn và thông báo 2 = biểu tượng hiển thị và thông báo <--- Cái bạn cần

Ví dụ: nếu bạn cần máy chủ RealVNC luôn xuất hiện, bạn sẽ nhập:

winvnc4.exe 2

như các thông số

Bạn có thể tìm ra tên của tệp thực thi theo một số cách khác nhau, chẳng hạn như mở hộp thoại Chạy và nhập msconfigvà xem các chương trình khởi động, điều hướng thủ công đến thư mục cài đặt C:\Program Files\{your program}hoặc cố gắng khớp chương trình mong muốn bằng cách xem chạy các quy trình trong Trình quản lý tác vụ. 9 trong số 10 lần này sẽ dẫn đến thành công.

Để làm việc này, người dùng phải chạy ứng dụng trước đó và sau đó đăng xuất đúng cách để explorer.exe có cơ hội ghi lịch sử khu vực thông báo cập nhật vào Registry. Trong lần đăng nhập tiếp theo, tập lệnh sẽ xác định thành công chương trình trong lịch sử và cập nhật cài đặt của nó để luôn hiển thị.

Bạn cũng có thể thử chạy tập lệnh theo cách thủ công từ dấu nhắc PowerShell để gỡ lỗi, nhưng bạn PHẢI giết explorer.exe ('taskkill / f / im explorer.exe') trước khi chạy nó, nếu không explorer sẽ không thấy cập nhật của bạn và sẽ ghi đè lên nó khi nó bỏ.

Tôi không có tín dụng cho quá trình này. Tôi đã không viết nó, tôi chỉ tìm thấy nó. Tín dụng cho kịch bản đi vào Micah Rowland . Tín dụng cho quy trình GPO dành cho Geoff Kendal


Tôi ra khỏi văn phòng một thời gian, và khi tôi trở lại, tôi đã quên mất điều này. Nếu bạn có thể @ đưa ra nhận xét này vào cuối tuần tới, tôi sẽ có thể xem xét kỹ hơn và có thể chuyển câu trả lời được chấp nhận.
Joel Coehoorn

Câu trả lời chỉ liên kết là không có do thối liên kết trong tương lai. Vui lòng bao gồm thông tin thích hợp trong câu trả lời của bạn. Chúng tôi cũng không quan tâm nếu bạn trả lời một câu hỏi cũ, đây thực sự là một điều TỐT, vì vậy vui lòng xem xét xóa "lời xin lỗi" và lý do để đăng. :)
cʜιᴇ007

@ techie007 Cảm ơn, đã chỉnh sửa @ Joel Coehoorn Tôi sẽ đăng một ghi chú để nhắc nhở tôi: P
Joshua Parnell

@JoelCoehoorn Đây là câu trả lời @ của bạn. Xin lỗi nó mất quá nhiều thời gian, plumb quên nó.
Joshua Parnell

Nó hoạt động tốt, nhưng chạy rất chậm: mất> 20 giây để hoàn thành trên PC nhanh hợp lý của tôi.
Mozzis

4

Tôi không biết liệu bạn có thể đặt thứ tự bộ đệm cho các biểu tượng hay không vì nó có thể thay đổi liên tục nếu chương trình mới được thêm vào, nhưng bạn có thể đặt thông báo thành "Luôn hiển thị tất cả biểu tượng và thông báo trên thanh tác vụ".

Để đặt mặc định này thành mặc định, hãy đi tới khoá đăng ký này:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer

Thêm giá trị DWORD " EnableAutoTray", bấm đúp vào nó và đặt giá trị thập lục phân thành " 0".

Tôi đã thử nghiệm điều này và nó đã làm việc.

Lưu ý thú vị: Lần đầu tiên tôi thử thêm nó vào khóa này:

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

Tôi đã luôn nghĩ rằng đó là đăng ký mặc định cho người dùng mới, nhưng nó không hoạt động. Vì vậy, tôi đã đi tìm và thấy bài viết thú vị này phá vỡ những suy nghĩ bấy lâu của tôi về khóa .DEFAULT đó.

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

Bổ sung: Điều tốt nhất tôi có thể nói là các mục đăng ký ở đây Nếu bạn định thử và đặt một biểu tượng theo cách bạn sẽ làm nếu bạn mở " Control Panel\All Control Panel Items\Notification Area Icons":

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

Nếu bạn nhìn vào chúng, chúng không dễ hiểu lắm, vì vậy tôi không chắc bạn sẽ chỉnh sửa chúng tốt đến mức nào.

Tôi khuyên bạn nên cân nhắc việc tạo một người dùng mới và hồ sơ của nó, đặt "Biểu tượng bảng điều khiển \ Tất cả các bảng điều khiển \ Biểu tượng khu vực thông báo" cho một biểu tượng đó (ít nhất là) thành "Hiển thị biểu tượng và thông báo".

Sau đó khởi động lại để phát hành hồ sơ và đăng nhập với tư cách quản trị viên. Sao chép hồ sơ đó vào hồ sơ " C:\Users\Default". Bạn có thể làm điều đó bằng cách sử dụng Explorer hoặc theo cách chúng tôi đã sử dụng để làm điều đó trong " Control Panel\All Control Panel Items\System" " Advanced System Settings>Advanced>User Profiles>Copy to". Nó sẽ chuyển sang màu xám, nhưng bạn có thể sử dụng Windows Enabler để khắc phục điều đó.


Tôi thà không hiển thị tất cả các biểu tượng, nhưng tôi sẽ làm nếu tôi phải.
Joel Coehoorn

Tôi sẽ thêm vào câu trả lời.
KCotreau

Tôi đã thấy Windows Enabler và các giải pháp hồ sơ sao chép khác, nhưng thử nghiệm đã cho thấy rằng điều này thực sự bị hỏng cho windows 7. Nó làm tôi buồn :(
Joel Coehoorn

Tôi đồng ý Joel, TẠI SAO họ sẽ vô hiệu hóa chức năng đó? Tôi vẫn không có ý tưởng nào khác ngoài việc mọi người cố gắng sao chép nó vào chỗ sai.
KCotreau

@KCotreau: Đó là trên blog Triển khai Windows. Nó có một cái gì đó để làm với các hoạt động nhất định chỉ xảy ra trong quá trình tạo hồ sơ, tức là "Chuẩn bị máy tính để bàn của bạn." Thành thật mà nói nó hút, nhưng tôi có thể thấy lý do tại sao họ đang cố gắng di chuyển mọi người ra khỏi phương pháp này. Nó chỉ đơn giản là không thể đoán trước kết quả cuối cùng sẽ là gì.
Surfasb

1

Chạy cái này với tư cách quản trị viên:

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

Lưu ý HKLM thay vì HKCU .

Xác minh hiệu lực với:

ps explorer | kill

Nó hiển thị tất cả các biểu tượng cho tất cả các hồ sơ.


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 có một trình bao bọc định dạng khối mã để bạn không phải sử dụng <br>trên mỗi dòng.
Bí tích

0

nó hiện có sẵn trong chính sách nhóm phiên bản mới hơn, xem tùy chọn B

Tất cả các tùy chọn này có sẵn trong User Configuration\Administrative Templates\Start Menu and Taskbar

Bạn có thể:

A) Tắt hoàn toàn hoặc bật hoàn toàn ("ẩn vùng thông báo", hoạt động cho cả XP và 7)

B) Hiển thị tất cả hoặc tiếp tục hiển thị các biểu tượng mà người dùng chỉ định ("tắt dọn dẹp khu vực thông báo," "

Hoạt động cho cả XP và 7) C) Chỉ vô hiệu hóa một số biểu tượng nhất định có trong GPO mặc định, chẳng hạn như Trung tâm hành động, Mạng, Đồng hồ pin, Âm lượng. Theo như tôi có thể nói, đó là 4 biểu tượng Khu vực thông báo duy nhất bạn có thể làm việc thông qua GPO 2008R2 mặc định (và chúng chỉ hoạt động cho Vista trở lên hoặc 7 trở lên).


1
Vì vậy, sau đó, những gì tôi đã hỏi không có sẵn thông qua chính sách nhóm, vì tôi muốn buộc một biểu tượng cụ thể luôn hiển thị và đó không phải là một trong các tùy chọn GPO được mô tả ở đây.
Joel Coehoorn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.