2011-10-24 50 views
14

Làm thế nào tôi tôi có thể thiết lập một NotifyIcon để luôn có thể nhìn thấy trong khay phải: http://screensnapr.com/v/qKWHe2.pngĐặt biểu tượng khay để luôn hiển thị

vì nó thay đổi nó trên vào cửa sổ biểu tượng không hoạt động: http://screensnapr.com/v/jjtuK0.png

Vấn đề này là biểu tượng khay có menu ngữ cảnh cho phép ai đó chụp ảnh màn hình. Vì vậy, mỗi khi họ chụp ảnh màn hình, cửa sổ biểu tượng không hoạt động nằm trong ảnh, chặn bất kỳ thứ gì phía sau nó giống như một máy bay ném bom ảnh.

Tôi biết có thể thực hiện điều đó thông qua mã vì các ứng dụng khác như comodo đã thực hiện nó mà không cần phải kéo và thả biểu tượng lên đó. Đối pining một shortcut vào thanh taskbar Tôi đã học được rằng bạn thiết lập một phím tắt trong thư mục này:

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

Có một cái gì đó tương tự cho khay? Hoặc là có một lựa chọn tôi có thể sử dụng mã khôn ngoan.

+0

Việc đưa ra các biểu tượng khu vực thông báo "trạng thái luôn hiển thị" là lựa chọn của người dùng được thực hiện thông qua hộp thoại thuộc tính của thanh tác vụ. Tôi sẽ ngạc nhiên nếu Windows tiếp xúc với giao diện có lập trình cho nó. – Jon

+0

Có, và thông thường tôi sẽ không cố ép nó lên người dùng. Nhưng điều quan trọng là họ tạo một ảnh chụp màn hình không được che phủ bởi cửa sổ biểu tượng không hoạt động. – Drake

+0

Sau đó, họ có thể đi vào "Tùy chỉnh ..." và nói rằng họ muốn biểu tượng đó hiển thị mọi lúc. –

Trả lời

7

Không áp dụng bởi mã, chỉ cần hướng dẫn người sử dụng để làm cho nó luôn hiển thị

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

Nhưng bạn có thể quản lý để hack nó bằng cách sửa đổi một mục đăng ký

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

séc this

+5

Một lần nữa, điều đó không đúng bởi vì có những ứng dụng như comodo đã đặt mình vào khu vực khay ngay lập tức của tôi mà không cần tôi đặt nó ở đó để bạn không thể tranh luận rằng điều đó là không thể. Bạn không biết hoặc bỏ qua nó là một vấn đề khác nhưng không tuyên bố là quan niệm sai lầm phổ biến – Drake

+0

nếu vậy thì .. tất cả các nhà cung cấp phần mềm sẽ làm điều đó và buộc người dùng thấy biểu tượng khay của họ! –

+0

@Drake: Tôi tin rằng quan niệm sai lầm là của bạn ở đây. Bạn có biết mọi chi tiết về thuật toán "quyết định biểu tượng nào được hiển thị" không? Nếu bạn không, làm thế nào bạn có thể được như vậy chắc chắn rằng nó là "luôn luôn hiển thị", đặc biệt là khi có văn học và ý thức chung không đồng ý với điều này? – Jon

5

Đưa ra các biểu tượng khu vực thông báo "trạng thái luôn hiển thị" là lựa chọn mà người dùng thực hiện thông qua các thuộc tính thanh tác vụ hộp thoại. Đây là quyết định thiết kế của nhóm Windows thích hợp theo thứ tự để đưa lựa chọn này theo quyết định của người dùng.

Vì lý do này, there is no programmatic interface cho phép bạn tạo biểu tượng luôn hiển thị. Thậm chí còn có no interface to ask if your icon is visible or not.

Trong giày của bạn, tôi chỉ thiết lập phím nóng cho phép người dùng chụp ảnh màn hình mà không tham gia vào biểu tượng nào (tất cả các chương trình chụp màn hình đều làm điều này).

Nếu người dùng thực sự thích nhấp chuột phải trước khi chụp ảnh màn hình, họ luôn có thể thay đổi tùy chọn của họ thông qua thuộc tính thanh tác vụ như đã đề cập ở trên.

+1

Nó không phải là một loại ứng dụng đòi hỏi một phím nóng toàn cầu, nó cho khi họ muốn tự nguyện cung cấp một ảnh chụp màn hình với một báo cáo lỗi để thử nghiệm. Phải ghi nhớ hoặc từ bỏ một sự kết hợp phím nóng cụ thể cho điều này là xâm nhập hơn là chỉ có nó hiển thị trong khay. – Drake

+0

@Drake: Tôi không nói * buộc họ làm điều này *. Tôi đang nói "cung cấp cho họ tùy chọn, và nó cũng sẽ giải quyết vấn đề hiện tại của bạn cho những người mang nó". – Jon

+2

Họ có một tùy chọn, nếu họ không muốn nó trong danh sách khay hoạt động. Họ luôn có thể kéo nó vào một không hoạt động. Nhưng theo mặc định, họ sẽ có thể thấy rằng ứng dụng đang chạy và nó đã sẵn sàng để có một lệnh bất cứ lúc nào họ cần nó. Tôi đã có thể tưởng tượng những người đang cố gắng chạy hai trường hợp của nó bởi vì họ không thể thấy rằng nó đang hoạt động, hoặc cuối cùng quên mất nó có sẵn cho họ. – Drake

0

Microsoft đã nêu rõ lập trường rằng đây là quyết định cho người dùng chứ không phải là quyết định cho người dùng theo chương trình. Có nhiều tiện ích khác nhau xung quanh việc hack ở bên trong để đạt được điều này, nhưng không có cách nào được hỗ trợ để đạt được những gì bạn mong muốn.

7

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.

Ngắn câu chuyện ngắn, kết hợp PowerShell (tập lệnh đượ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 ra một kịch bản PowerShell chứa 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[]] [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 
    } 
} 

Lưu nó như là một tập tin ps1 bằng cách sử dụng tên mà 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 tạo 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), và sau đó nhập tham số, nhập tên chương trình ! nhạy cảm) tiếp theo là thiết lập để sử dụng:

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

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

winvnc4.exe 2

như paramenters

Bạn có thể tìm ra tên của file thực thi trong một vài cách khác nhau, chẳng hạn như khi mở hộp thoại Run và gõ msconfig và nhìn vào các chương trình khởi động, bằng tay điều hướ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 các tiến trình đang chạy trong Task Manager. 9 lần trong số 10 điều này sẽ dẫn đến thành công.

Để làm việc này, trước tiên người dùng phải chạy ứng dụng 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ẽ định vị thành công chương trình trong lịch sử và cập nhật cài đặt của chương trình để 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ừ lời nhắc PowerShell để gỡ lỗi, nhưng bạn PHẢI diệt explorer.exe ('taskkill/f/im explorer.exe') trước khi chạy nó, nếu không trình khám phá sẽ không thấy cập nhật của bạn và sẽ ghi đè lên khi nó thoát.

Tôi không có tín dụng cho quy 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 đến Micah Rowland. Ghi có cho quá trình GPO chuyển đến Geoff Kendal

Không đủ danh tiếng để liên kết với tác giả gốc, ngoại trừ danh tiếng ở trên cùng.

+1

@MatthewR. Cảm ơn, đã chỉnh sửa. – jparnell8839

0

Sử dụng một cái gì đó như tập lệnh này để nâng cao gói phần mềm để hộp kiểm đơn giản, người dùng có thể quyết định có nên ghim biểu tượng vào vùng thông báo hay không mà không phải nhảy qua các vòng khác nhau mà Microsoft đã chọn đặt trong cách có vẻ như một ý tưởng tuyệt vời về khả năng tiếp cận.

Có thể nếu Microsoft đã cung cấp tùy chọn ghim/bỏ ghim nhấp chuột phải trên biểu tượng khu vực thông báo (như thanh tác vụ) hoặc khả năng chương trình dễ dàng cung cấp tính năng như vậy, chúng tôi sẽ không có cuộc thảo luận này.

Các vấn đề liên quan