黄季冬=>fox23

Freesc Huang
&
Windows Embedded
数据加载中……
[CF.Skills]托管代码在Smartphone上创建快捷方式

[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
   2008/4/15

posted on 2008-04-15 20:57 fox23 阅读(1587) 评论(23)  编辑 收藏 所属分类: Winbile Skills

评论

#1楼  2008-04-15 21:54 生鱼片      

楼主辛苦,支持
    回复  引用  查看    

#2楼  2008-04-15 22:18 李战      

路过,学习!
    回复  引用  查看    

#3楼 [楼主] 2008-04-15 22:19 fox23      

@生鱼片
:-)
    回复  引用  查看    

#4楼 [楼主] 2008-04-15 22:21 fox23      

@李战
多交流 :)
    回复  引用  查看    

#5楼  2008-04-15 22:33 appleseeker      

支持下~~~
    回复  引用  查看    

#6楼 [楼主] 2008-04-15 23:00 fox23      

@appleseeker
long time no see~
    回复  引用  查看    

#7楼  2008-04-15 23:36 appleseeker      

@fox23
so busy that can't write anything......
    回复  引用  查看    

#8楼  2008-04-16 09:42 啊黄      

不错!
    回复  引用  查看    

#9楼  2008-04-17 09:28 西风烈 [未注册用户]

版主:我现在想在你那个调用wmp控件的demo上添加自动侦测播放结束,然后产生消息,这个怎么做啊?
    回复  引用    

#10楼 [楼主] 2008-04-17 09:45 fox23      

@西风烈
Check SystemState.MediaPlayerTrackTimeElapsed Property
    回复  引用  查看    

#11楼  2008-04-17 12:52 西风烈 [未注册用户]

那我是不是要在播放前得到播放曲目时长啊?SystemState好像没这个功能啊?
    回复  引用    

#12楼  2008-04-17 13:14 马宁      

写得不错!
    回复  引用  查看    

#13楼 [楼主] 2008-04-17 13:56 fox23      

@马宁
老马下个月具体啥时候能到?我来拜访你:-)
    回复  引用  查看    

#14楼 [楼主] 2008-04-17 13:58 fox23      

--引用--------------------------------------------------
西风烈: 那我是不是要在播放前得到播放曲目时长啊?SystemState好像没这个功能啊?
--------------------------------------------------------
播完的时候Elapsedtime难道不返回0????您到底试过没有啊?
    回复  引用  查看    

#15楼  2008-04-17 16:59 西风烈 [未注册用户]

if (wmpProcess != null)
wmpProcess.Start();
mediatxt.WriteFile("start media!\r\n");
Thread.Sleep(2000);
while (!IsRunning)
{
mediatxt.WriteFile("not play!\r\n");
}
public bool IsRunning
{
get { return SystemState.MediaPlayerTrackTimeElapsed != 0 ? true : false; }
}
版主:我下午用这段程序测试了,播放完之后,确实没有返回零啊?
    回复  引用    

#16楼  2008-04-17 22:33 黎波      

好文!
    回复  引用  查看    

#17楼 [楼主] 2008-04-17 23:53 fox23      

@黎波
有空了北上找我玩~
    回复  引用  查看    

#18楼  2008-04-18 00:03 xifenglie2006 [未注册用户]

楼主,再帮我指点一下啊?
    回复  引用    

#19楼  2008-04-19 12:08 xifenglie2006 [未注册用户]

楼主,我现在基本需要的功能用opennetcf都已经实现了,我要把它整合到我的项目里去,做成activeX控件?这个大概怎么弄啊?
    回复  引用    

#20楼  2008-04-23 14:02 MS_Frank      

指证一点错误。

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

快捷方式前面的数字不是指的目标路径的字符串。

具体是用来干什么的我也不知道,似乎这个数字不影响快捷方式的正常使用。
    回复  引用  查看    

#21楼 [楼主] 2008-04-23 15:02 fox23      

@MS_Frank
1.however,I'm pretty sure that the number is used to record the length of command line ,have you ever tried to open the ink file on windows CE?
for moredetails pls check out this article by Mike Hall:
http://msdn2.microsoft.com/en-us/embedded/aa731295.aspx

2.the number defines the buffersize of command line to mapping file and *.ink* when the OS was built . if it goes wrong(eg.you replace it with less one) , you will get a alert like "Can not find XXXXX".

Freesc
    回复  引用  查看    

#22楼 [楼主] 2008-04-23 15:05 fox23      

@xifenglie2006
use your search engine , it's not very difficult:)
    回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-15 23:46 编辑过
 
另存  打印