归纳一些小技巧
最近开发的东西,有用到一些小功能。这些功能原先用C++是不在话下了,但是.NET没提供封装,只是一点点小功能,不想用C++包一层,所以花了时间去查去找。
尽管功能简单,但想到可能会让一些同学节约时间,因此就拿出来分享一下。
1. 启动当前用户的屏幕保护程序。
首先想到的是用Process.Start,但是不知道为什么,只管报错,说"xxx.scr"没有关联的程序之类的。哪怕是用ProcessStartInfo中的UseShellExecute属性设置为true,也不行。
终于没招,先用Microsoft.VisualBasic.Interaction.Shell来完成,这倒很快,就是多了一个引用。
2. 获取快捷方式(lnk文件)的详细信息
这个实在找不到方法,最终导入COM组件(Shell32.dll)来解决这个问题。我的目的是取到当前用户的开始菜单中的快捷方式所指向的程序。
尽管功能简单,但想到可能会让一些同学节约时间,因此就拿出来分享一下。
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, false, 0);
scrnsave = (string)key.GetValue("SCRNSAVE.EXE", null);
if (scrnsave != null)
Microsoft.VisualBasic.Interaction.Shell(scrnsave + " -s", Microsoft.VisualBasic.AppWinStyle.MaximizedFocus, false, 0);
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);
}
}
}
}
}
代码没经过优化,应该比较清楚。{
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);
}
}
}
}
}