[CF.Skills]在.NET CF中嵌入Media Player(C#)

昨天有人在http://winbile.net/bbs上问到,在WM5上面如何使用MediaPlayer播放音乐。
其实微软有在一个多媒体案例中提到,详见:
http://www.microsoft.com/china/MSDN/library/Mobility/pocketpc/WorkingwithMultimedia.mspx
只不过方法有些复杂,不过还好你可以下载它的Sample,然后在你的托管项目中引用该项目。
不管怎么说,毕竟.NET Compact Framework中没有可以直接操作wmp的方法。但是,即便如此我们仍然可以使用托管代码对windows media player进行控制。其基本思路是先为media player创建一条单独的进程,再通过忘Media player的窗体发送消息来控制Media Player。下面来看看这是如何通过托管代码做到的,
首先,创建进程并传入相应参数:

            wmpProcess = new Process();
            wmpProcess.StartInfo.FileName 
= "wmplayer.exe";
            wmpProcess.StartInfo.Arguments 
= wmpArgs;

这里要注意一下Arguments的格式,应该像这样:"""\My Documents\TestVideo.wmv"" /fullscreen";文件路径必须和后面的参数区分开,这里C#和VB中,这样的加双引号的方式是合法的。
然后,启动进程,音乐开始播放了(此时也许你希望用户的焦点仍然你的FORM,那么你应将你的form放置在顶层),在WM5.0以上的系统中,提供了更多对WMP的支持,你可以通过某些属性访问到当前播放的曲目名,艺术家的名字,专辑名,比特率,已经播放的时间(精确到毫秒)甚至是音乐风格。下面列举了一些:
            artist = SystemState.MediaPlayerTrackArtist;
            playingTrack 
= SystemState.MediaPlayerTrackTitle;
            album 
= SystemState.MediaPlayerAlbumTitle;
            bitRate 
= SystemState.MediaPlayerTrackBitrate;
            style 
= SystemState.MediaPlayerTrackGenre;

还有一个问题是如何停止MediaPlayer呢?我们还是可以通过给窗体发送消息来间接的控制,不过这里要用到一个本地的函数SendMessage,代码如下:

    
//引用SendMessage并命名为CloseWMP
        private const UInt32 WM_CLOSE = 16;
        [DllImport(
"Coredll.dll", EntryPoint = "SendMessage")]
        
public static extern Int32 CloseWMP(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
//用的时候这样
          public void StopWMP()
        
{
            MyRef.CloseWMP(wmpProcess.MainWindowHandle, WM_CLOSE, 
00);
        }

程序运行效果如下:



完整的代码点击此处下载

 All rights reserved by Freesc Huang
 http://fox23.cnblogs.com
 hjd.click [AT] gmail.com
2008-2-18

posted on 2008-02-18 02:36 Freesc Huang 阅读(2077) 评论(9) 编辑 收藏

评论

#1楼 2008-03-23 15:13 song12345[未注册用户]

请问在compact framework 中已不支持Process调用了,那么如何不使用MainWindowHandle而能获得mediaplayer的窗口句柄哪?   回复 引用   

#2楼[楼主] 2008-03-25 17:46 fox23      

1."在compact framework 中已不支持Process调用了"?这个您是什么意思?我不太明白,就算不用Process类,用ceCreateProcess API也行
2.其他的方法还有不少,比如Findwindow等API
3.问问题欢迎来http://winbile.net/bbs
 回复 引用 查看   

#3楼 2008-06-24 17:49 abob[未注册用户]

1:.net cf是支持Process调用的
2:楼主这么麻烦的调用wmp,为什么不直接做成WMP的AcitveX空间呢,AlexFeinman已经给了我们最好的封装了 http://msdn.microsoft.com/zh-cn/library/aa446515.aspx
 回复 引用   

#4楼 2008-08-04 16:40 icewindq[未注册用户]

关闭播放器其实不用这么复杂呀
使用wmpProcess.CloseMainWindow()就可以了,省去P/invoke
 回复 引用   

#5楼[楼主] 2008-08-04 17:06 fox23      

@abob
自带的WMP本身就是一个ActiveX,简单的播放音频足够了.Alex的例子可以用来学习如何开发一个自己的media player
 回复 引用 查看   

#6楼[楼主] 2008-08-04 17:11 fox23      

@icewindq
对,不过C#里面的CloseMainWindow还是sendmessage给wmp的窗体实现的.
BTW:closeMainWindow之后别忘了再调用process.Close()释放资源

黄季冬
 回复 引用 查看   

#7楼 2009-02-05 11:00 yytoday[未注册用户]

在完整的代码中找不到
Microsoft.WindowsMobile.Forms;
Microsoft.WindowsMobile.Status;
的引用,不知道怎么添加

 回复 引用   

#8楼 2009-02-27 01:11 Sing173[未注册用户]

请教楼主:我想在主程序里调用一个外部程序,是照相软件来的,但不知道它的StartInfo.Arguments怎么设置,有什么方法可以解决吗?不设置又出错,急啊,希望楼主指教一下小弟,万分感谢~~~  回复 引用   

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

These postings are provided "AS IS" with no warranties
and confer no rights.


Locations of visitors to this page

Blog Keywords
Embedded System,Visual Studio,.Net Framework,.Net Compact Framework,.Net Micro Framework,Windows Mobile,Windows Embedded CE,Emulator,WCF,CLR,Design & Pattern,C/C++,C#,Matlab,Algorithms
昵称:Freesc Huang
园龄:4年11个月
粉丝:32
关注:4

统计

  • 随笔 - 197
  • 文章 - 0
  • 评论 - 840

搜索

 

随笔分类(227)

随笔档案(197)

Blogs

Link

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜