0
namespace SyncFileIconOverlay
{
[ComVisible(true)]
public class SyncFileIconOverlay:SharpIconOverlayHandler
{
   
    protected override int GetPriority()
    {
        //  The read only icon overlay is very low priority
        return 90;
    }

    public int PriorityGetter()
    {
        return GetPriority();
    }

    protected override bool CanShowOverlay(string path, FILE_ATTRIBUTE attributes)
    {
        try
        {
            //  Get the file attributes
            var fileAttributes = new FileInfo(path);

            //  Return true if the file is read only, meaning we'll show the overlay
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

    public bool CanShowOverlayGetter(string path)
    {
        return CanShowOverlay(path, FILE_ATTRIBUTE.FILE_ATTRIBUTE_NORMAL);
    }

    protected override System.Drawing.Icon GetOverlayIcon()
    {
        //  Return the read only icon
        return Properties.Resources.ReadOnly;
    }

    public System.Drawing.Icon OverlayIconGetter()
    {
        return GetOverlayIcon();
    }

   }
}

https://www.codeproject.com/Articles/545781/NET-Shell-Extensions-Shell-Icon-Overlay-Handlersから見つけた上記のコードを使用しています

これはクラス ライブラリにあり、overlayicon が必要なときに winform アプリケーションからこの dll を参照します。PriorityGetter を呼び出してから、CanShowOverlayGetter を確認して、最後に OverlayIconGetter を呼び出します。CanShowOverlay 関数がファイルに対して true を返す場合、オーバーレイ アイコンが変更されますが、問題はありません。システムは、dll を登録してエクスプローラーを再起動するときに何もせずに、コンピューター内のすべてのファイルに対してこれを使用しますか?プログラムから動的に取得されるファイル。どうすればこの感謝を達成できるか分かりますか!!!

4

1 に答える 1

0

制限があるため、アイコンオーバーレイが機能する前にいくつかの作業が必要です。ここで確認できます。 Windows 7 および Windows 10 でアイコン オーバーレイを表示する.

...15 個のオーバーレイのハード リミットがあります。レジストリにはリストがあり、オーバーレイをインストールするアプリの数に関係なく、最初の 15 個だけが使用されます。残りは無視されます。

更新 1
ファイル経由で行うより良い方法が見つかりませんでした。ただし、このサンプルでは、​​特定のフォルダーにオーバーレイ アイコンが表示されます。

ステップ 1: 非表示にできるファイル マーカーを設定します。私のサンプルでは、.marker​​それは単なる空のファイルです。

ステップ 2: オーバーレイ アイコン ハンドラー。

[ComVisible(true)]
public class FileValidIconOverlayHandler : SharpIconOverlayHandler
{
    protected override int GetPriority()
    {
        return 10;
    }

    protected override bool CanShowOverlay(string path, FILE_ATTRIBUTE attributes)
    {
        var file = new FileInfo(path);
        var hasFileMarker = file.Directory.GetFiles(".marker").Length > 0;
        var isNotFileMarker = file.Name != ".marker";
        var isNotDirectory = !file.Attributes.HasFlag(FileAttributes.Directory);

        return hasFileMarker && isNotFileMarker && isNotDirectory;
    }

    protected override System.Drawing.Icon GetOverlayIcon()
    {
        return Properties.Resources.Valid;
    }
}

で出力.marker
ここに画像の説明を入力

なしで出力.marker
ここに画像の説明を入力

于 2020-09-04T23:27:43.497 に答える