黄季冬=>fox23

Freesc Huang & Smart Devices
数据加载中……
[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 阅读(1328) 评论(9)  编辑 收藏 网摘 所属分类: 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" target="_new">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怎么设置,有什么方法可以解决吗?不设置又出错,急啊,希望楼主指教一下小弟,万分感谢~~~
    回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1071730




相关文章:

相关链接: