黄季冬=>fox23

Freesc Huang
&
Windows Embedded
数据加载中……
[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 fox23 阅读(652) 评论(7)  编辑 收藏 所属分类: Compact FrameworkMultimedia

评论

#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()释放资源

黄季冬
    回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: