web-dev-qa-db-ja.com

トレイアイコンを常に表示するように設定します

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

トレイに似たものはありますか?または、コードを賢く使用できるオプションはありますか。

18
Drake

私はオンラインで検索していて、実際にこれをランダムに見つけました。

簡単に言うと、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}に手動で移動する、または試すなど、いくつかの方法で確認できます。タスクマネージャで実行中のプロセスを確認して、目的のプログラムに一致させます。 10回のうち9回、これは成功につながります。

これが機能するためには、ユーザーは以前にアプリケーションを実行し、適切にログアウトして、Explorer.exeが更新された通知領域の履歴をレジストリに書き込む機会を得る必要があります。その後のログインで、スクリプトは履歴内のプログラムを正常に見つけ、常に表示されるように設定を更新する必要があります。

PowerShellプロンプトからスクリプトを手動で実行してデバッグすることもできますが、実行する前にExplorer.exe( 'taskkill/f/im Explorer.exe')を強制終了する必要があります。そうしないと、Explorerは更新を認識せず、上書きされます。それが終了したときにそれ。

私はこのプロセスを信用していません。私はそれを書きませんでした、私はそれを見つけました。スクリプトのクレジットはMicahRowlandにあります。 GPOプロセスのクレジットはGeoffKendalに送られます

一番上にあるものを除いて、元の著者にリンクするには十分な評判がありません。

7
jparnell8839

コードでは適用できません。常に表示するようにユーザーに指示するだけです。

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

しかし、レジストリエントリを変更することで、なんとかハッキングすることができます

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

チェック this

7
Mohamed Abed

通知領域アイコンに「常に表示」ステータスを与えることは、ユーザーがタスクバーのプロパティダイアログから行う選択です。これは、ユーザーの裁量でこの選択を行うために(== --- ==)、適切なWindowsチームによって行われた設計上の決定です

このため、 プログラムインターフェイスはありません アイコンを常に表示できるようにします。 アイコンが表示されているかどうかにかかわらずaskへのインターフェイスはありません もあります。

あなたの靴の中で、私はユーザーがアイコンにまったく関与せずにスクリーンショットを撮ることができるホットキーを設定しました(すべての画面キャプチャプログラムがこれを行います)。

ユーザーがスクリーンショットを撮る前に右クリックするのが本当に好きな場合は、上記のようにタスクバーのプロパティを使用していつでも設定を変更できます。

6
Jon

このスクリプトのようなものを使用してソフトウェアパッケージを拡張し、ユーザーが簡単なチェックボックスを使用して、Microsoftが邪魔することを選択したさまざまなフープを飛び越えずに、アイコンを通知領域に固定するかどうかを決定できるようにします。アクセシビリティの観点からは素晴らしいアイデアのようです。

マイクロソフトが通知領域のアイコン(タスクバーなど)で右クリックのピン留め/ピン留め解除オプションを提供していた場合、またはプログラムがそのような機能を簡単に提供できる機能を提供していた場合、この議論はありません。

0
Kurt

Microsoftは、これはユーザーの決定であり、プログラムで行うことのできる決定ではないという立場を明確に示しています。はい、これを達成するために内部をハックするさまざまなユーティリティがありますが、あなたが望むものを達成するためのサポートされた方法はありません。

0
David Heffernan