夜听女人这辈子挺难的:用.NET/C#进行Shell编程

来源:百度文库 编辑:偶看新闻 时间:2024/04/18 20:05:35

用.NET/C#进行Shell编程

2006年6月28日 1:48

这些天我在家里用C#实现一个资源管理器控件,功能和Windows自己的那个类似,我想把它实现的和Windows的尽量接近 — 当然是越接近越好啦。

问题马上就来了,.NET目前似乎并不是很擅长搞这个,或者说那些相关的Windows API还没被收入进FCL(WinFX/.NET 3.0应该已经收录了吧),这下可麻烦了:

  • 地址栏
    MFC里面有个CComboBoxEx类,可以用来做带层次缩进和图标的ComboBox,实现资源管理器的地址栏。但是.NET没有,不过还好可以继承System.Windows.Forms.ComboBox类,然后重写OnDrawItem方法,搞定
  • 文件图标
    .NET 2.0终于开始支持这个功能了,就是Icon.ExtractAssociatedIcon方法,不过它返回的总是文件的大图标.... 而Windows XP里面一个文件可以包含大中小三种尺寸的图标(每种还有三等色深所以一共是九种),所以还是得调用SHGetFileInfo这个API;
    还有些图标是在shell32.dll里头的(比如文件夹的图标),那样还得把它们枚举出来... 这个得用ExtractIconEx;
    此外还要维护一个ImageList,不然占用太多Icon句柄,会发生GDI Failue的... 这个还好,FCL已经有这个类支持了
  • 文件类型信息
    每种文件类型都有一个Description,比如说.doc就是Microsoft Word Document,也记录在注册表里头。这个问题我在CSDN已经回答了N遍,不想再打一遍了
  • 文件夹背景图
    这个暂时还没功夫去研究,并且我认为这个功能相对不是那么的重要。还有文件夹缩略图之类的... 不是一般的麻烦,日后再说
  • 左边的树形视图
    .NET自带了TreeView控件,只要有Icon,剩下的工作就很容易了
  • 右键菜单
    菜单里有很多项目都是记录在注册表里面的。这个又是个很大的话题... 总而言之就是麻烦得要死。不过那些Cut、Copy、Delete、Properties什么的操作的实现倒是简单,可以直接用ShellExecuteEx这个API
  • 快捷方式
    解析.lnk文件到目标文件,可以直接打开文件流读取里面的字符,在某个偏移量的某个位置是可以找到的,不过这样不“安全”,还是用API吧。MSDN说可以使用IShellLink和IPersistFile这两个COM接口,代码虽然很ugly但是不算很长。问题又来了,IShellLink没有继承IDispatch,只是继承了IUnknown,这意味着tlbimp.exe也帮不了忙(貌似),得自己声明那些接口和组件原型... 阿门,我今天搞了一晚上,还是不大对头,想睡觉了...
  • 主文件视图
    这个可以用.NET自带的ListView控件应付,和Windows一样它也带了5种浏览模式(Title、List、Detail等等),不用自己实现
  • 文件/文件夹的Tooltip
    Tooltip的内容并不是固定的... 比如说doc文件的Tooltip还会包括Author等信息,mp3文件则会有Duration之类的,这个要用Structure Storage相关的COM组件,超级麻烦,暂时不想管了~
  • .....
    .....

不过今天也不是没有收获,在Google上找到了这么个网站:
http://www.vbaccelerator.com/home/NET/Code/Libraries/Shell_Projects/index.asp

他们把很多Shell相关的东西给封装了一下,比如我一直郁闷的文件快捷方式的问题,他们已经提供了解决方案。早知道有这个,我就不用那么费劲了。   

# re: 用.NET/C#进行Shell编程

2006-6-28 8:33 by Kevin There are so many useful articles on Codeproject.com regarding Shell Programming, it‘s really simple to create a Explorer liked project using Windows Shell.

http://www.codeproject.com/atl/shellfoldertree.asp