4

我正在寻找一种从桌面隐藏特定图标的方法。我通常在我的桌面上有很多图标(这使得查找文件真的很麻烦),所以我想写一个小工具,在我输入时“过滤”它们。我不想“移动”或删除它们,只是隐藏(或变暗)它们。我知道如何一次切换显示所有图标的隐藏状态,但不是基于每个图标。有任何想法吗?

4

2 回答 2

3

我会尝试以某种方式导航到桌面的ListView控件(使用 Win32 API)。然后我会在我想要隐藏的项目上绘制一些半透明的矩形(您可以使用ListItem_GetItemRect宏/消息查询项目的矩形),从列表控件中临时删除项目,将项目的状态设置为CUT(淡出)或者我会尝试操纵列表视图的图像列表以添加透明图像并将项目的图像设置为此。

但我不知道这种方法是否可行......而且我不确定我是否会在 C# 中尝试这个(我宁愿使用 C++)。

于 2010-02-19T03:00:24.563 回答
3

@crono,我认为您最好的选择是添加对 COM 库“Microsoft Shell Control And Automation”的引用并使用Shell32.Shell对象。然后枚举快捷方式并设置快捷方式的文件属性(FileAttributes.Hidden)。

检查这些链接以获取更多信息。

看这个简单的例子,并不完整,只是一个草稿。

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using Shell32; //"Microsoft Shell Control And Automation"

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Shell32.Shell oShell;
                Shell32.Folder oFldr;
                oShell = new Shell32.Shell();
                oFldr = oShell.NameSpace(Shell32.ShellSpecialFolderConstants.ssfDESKTOP);//point to the desktop

                foreach ( Shell32.FolderItem oFItm in oFldr.Items()) //get the shotrcuts
                {

                    if (oFItm.IsLink)
                    {
                        Console.WriteLine("{0} {1} ", oFItm.Name, oFItm.Path);

                        bool isArchive = ((File.GetAttributes(oFItm.Path) & FileAttributes.Archive) == FileAttributes.Archive);
                        //bool isHidden = ((File.GetAttributes(oFItm.Path) & FileAttributes.Hidden) == FileAttributes.Hidden);

                        if (isArchive) //Warning, here you must define the condition for hide the shortcut. in this case only check if has set the Archive atribute. 
                        {

                            //Now you can set  FileAttributes.Hidden atribute
                            //File.SetAttributes(oFItm.Path, File.GetAttributes(oFItm.Path) | FileAttributes.Hidden);
                        }

                    }
                    else
                    {
                        Console.WriteLine("{0} {1} ", oFItm.Name, oFItm.Path);
                    }

                }

                Console.ReadKey();
            }
        }
    }
于 2010-02-19T03:00:35.217 回答