[CF.Skills]托管代码在SmartPhone上创建快捷方式(转)

摘要   以前我们经常是同步后在PC机上Copy程序并选择粘贴快捷方式,在Smartphone上添加快捷菜单,本文介绍了另外一种通过编程在Smartphone上创建快捷方式的方案。
Keywords   Smartphone,Shortcut,windows mobile,.NET Compact Framework,C#

尽管可以在制作CAB安装文件的工程中,通过强大的VS,简单的点击两下鼠标就能给安装文件添加快捷方式,但是有时候我们也需要在自己程序中实现这个功能,比如我们希望我们的程序是不需安装但是又要有快捷方式以方便用户操作。
Pocket PC上面要Copy一个快捷菜单是很easy的。只需再文件浏览器中选中你的文件并长按,菜单中选择Copy(复制)

然后到你要粘贴的文件夹,选择Paste Shortcut(粘贴快捷方式)即可:

但是Smartphones上却没有Paste Shortcut(粘贴快捷方式)这个选项。这时候创建快捷方式是有点麻烦的。用户通常只有同步到电脑之后,再在PC上对Smartohone上的文件进行相关的复制粘贴操作。

C++中,我们可以使用

BOOL SHCreateShortcut (LPTSTR szShortcut, LPTSTR szTarget);

或者

DWORD SHCreateShortcutEx (LPTSTR lpszDir, LPTSTR lpszTarget, LPTSTR szShortcut, LPDWORD lpcbShortcut);

来实现这样的功能,当然,你完全可以在托管代码中通过p/invoke来调用这两个函数,例如:

SHCreateShortcut(@"\Windows\StartUp\" + 
Path.GetFileNameWithoutExtension(applicationPath) 
+ ".lnk""\"" + 
applicationPath + "\""); 
 
[DllImport(
"coredll.dll", EntryPoint="SHCreateShortcut") ] 
private static extern bool SHCreateShortcut(string shortcut, string target); 

但是我们希望完全以C#实现的方式来做得更优雅,同时可以省略掉P/invoke的开销。

事实上,在Windows CEWindows Mobile中快捷方式文件本身是一个很简单的纯字符文本的文件。如果你用记事本打开那些CE-Based的系统中(Smartphone)上的一个快捷方式(.ink文件),你看到的将是类似下面所示的文本内容:

26#"\Windows\BubbleBreaker.exe”

其基本结构如下:

{目标路径命令包含的字符数}#"{目标路径命令}".

Tips这里所说的目标路径命令包含的字符数不包括引号在内,尽管和Windows Shell类似,在路径不包括空格的时候可以省略引号,但是习惯上还是建议始终使用引号

注意这里的目标路径命令很可能是带参数的,你需要用空格把参数和路径隔开,如果有N个参数,那么这N和参数都应当是用空格隔开的,这也是习惯用引号把路径引起来的原因。比如:

61#"\Program Files\Windows Media Player\wmplayer.exe" \fullscreen

表示指向的路径是“\Program Files\Windows Media Player\wmplayer.exe”,传递了一个参数“\fullscreen

有了上述对快捷方式文件结构的理解,我们可以轻松的创建自己的快捷方式了:

       StreamWriter sw;
        FileStream fs;
        
/// <summary>
        
/// 创建快捷方式
        
/// </summary>
        
/// <param name="destination">快捷方式的目标</param>
        
/// <param name="shortCut">快捷方式的名字</param>
        
/// <param name="parameters">快捷方式参数</param>
        
/// <returns>创建成功返回true</returns>

        private bool CreateShortCut(string destination, string shortCut, string parameters)
        
{
            
try
            
{
                
bool isQuoted = false;
                
//检查目标路径中是否含有空格    
                destination = destination.Trim();
                
if (destination.IndexOf(' '> -1)
                    isQuoted 
= true;
                
string link = destination;
                
int len = destination.Length;
                
if (isQuoted)
                    link 
= "\"" + link + "\"";
                
if (!String.IsNullOrEmpty(parameters))
                
{
                    
//有参数则加上参数长度和与路径间的空格
                    len += parameters.Length + 1;
                    link 
+= " " + parameters;
                }



                
//打开文件流写入上述信息
                 fs = new FileStream(shortCut,
                    FileMode.Create,
                            FileAccess.Write,
                            FileShare.ReadWrite);
                 sw 
= new StreamWriter(fs);
                sw.WriteLine(len.ToString() 
+ "#" + link);
            }

            
catch { }
            
finally
            
{
                
//别忘了关闭资源
                sw.Close();
                fs.Close();
            }

            
return true;
        }

现在我们用它在开始菜单创建一个快捷方式:

            CreateShortCut(@"\Storage Card\ShortCut_SP.exe"@"\Windows\Start Menu\MyApp.lnk""");

PS:这里我事先已经将模拟器的储存卡目录配置为程序输出目录

程序运行效果如下:

点击"Creat",创建快捷方式

然后我们可以在开始菜单中找到它了:Start-->All programs-->More

效果达到了,没有安装包,没有P/invoke,同样能在Smartphone上面创建自己的快捷方式
完整的代码在此处下载

 Enjoy!

 ©Freesc Huang
  黄季冬<fox23>@HUST   http://blog.csdn.net/fox_click/archive/2008/04/15/4684378.aspx
   2008/4/15

posted @ 2011-02-12 15:22  董雨  阅读(255)  评论(0编辑  收藏  举报