归纳一些小技巧

最近开发的东西,有用到一些小功能。这些功能原先用C++是不在话下了,但是.NET没提供封装,只是一点点小功能,不想用C++包一层,所以花了时间去查去找。
尽管功能简单,但想到可能会让一些同学节约时间,因此就拿出来分享一下。

1. 启动当前用户的屏幕保护程序。
  首先想到的是用Process.Start,但是不知道为什么,只管报错,说"xxx.scr"没有关联的程序之类的。哪怕是用ProcessStartInfo中的UseShellExecute属性设置为true,也不行。
  终于没招,先用Microsoft.VisualBasic.Interaction.Shell来完成,这倒很快,就是多了一个引用。
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop");
scrnsave 
= (string)key.GetValue("SCRNSAVE.EXE"null);
if (scrnsave != null)
    Microsoft.VisualBasic.Interaction.Shell(scrnsave 
+ " -s", Microsoft.VisualBasic.AppWinStyle.MaximizedFocus, false0);

2. 获取快捷方式(lnk文件)的详细信息
  这个实在找不到方法,最终导入COM组件(Shell32.dll)来解决这个问题。我的目的是取到当前用户的开始菜单中的快捷方式所指向的程序。
        private static List<string> FetchExeFileName()
        
{
            List
<string> exefiles = new List<string>();
            Shell sh 
= new ShellClass();
            Folder fdr 
= sh.NameSpace(ShellSpecialFolderConstants.ssfPROGRAMS);
            EnumFolder(
ref exefiles, fdr);
            
return exefiles;
        }


        
private static void EnumFolder(ref List<string> exefiles, Folder fdr)
        
{
            
foreach (FolderItem fi in fdr.Items())
            
{
                
if (fi.IsLink)
                
{
                    ShellLinkObject lnk 
= fi.GetLink as ShellLinkObject;
                    
string fn = Path.GetFileName(lnk.Path);
                    
if (Path.GetExtension(fn) == ".exe")
                    
{
                        
if (!exefiles.Contains(fn))
                            exefiles.Add(fn);
                    }

                }

                
else if (fi.IsFileSystem)
                
{
                    
if (fi.IsFolder)
                    
{
                        EnumFolder(
ref exefiles, (Folder)fi.GetFolder);
                    }

                    
else
                    
{
                        
string fn = Path.GetFileName(fi.Path);
                        
if (Path.GetExtension(fn) == ".exe")
                        
{
                            
if (!exefiles.Contains(fn))
                                exefiles.Add(fn);
                        }

                    }

                }

            }

        }

  代码没经过优化,应该比较清楚。

posted @ 2006-09-12 15:41  沐枫  阅读(1018)  评论(0编辑  收藏  举报