C#----使用WindowsMediaPlayer

本文介绍了在C#中如何使用WindowsMediaPlayer控件,包括控件必须依附于父控件,如Form或Panel,并且该控件需要有句柄。在实际使用前,需要进行初始化设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


         使用Windows Media Player 其实就是使用组件AxWindowsMediaPlayer,首先向工程中添加COM引用,如图1 选择Widows Media Player
         图片1
         
         这时能在工具箱中找到组件标记Windows Media Player,如图2
         图片2
         
         但这时还没有添加能引用类AxWindowsMediaPlayer所在的命名空间AxWMPLib;为了能添加using AxWMPLib;需要拖动组件到窗体中(如果此时的项目是类库的话,可以先添加窗体再删除,自然也能自动添加了命名空间),这时就出现了命名空间AxWMPLib;如果不想在窗体中显示组件,可以手动删除,到此,可以用类AxWindowsMediaPlayer了。
         
         拖动到窗体上的AxWindowsMediaPlayer可以直接使用,不用初始化但是new出来的不能直接使用。

         如果要使用的话,在使用时还有两个基本的条件:1、控件要依附在某个父控件上,比如form,panel;因为这样可以让组件保持长期性(网上这样说)。2、依附的控件是要有句柄;3、在使用前进行如下的初始化:


                  ((System.ComponentModel.ISupportInitialize)(this.ax1)).BeginInit();
                  ((System.ComponentModel.ISupportInitialize)(this.ax1)).EndInit();

第一种情况不满足时,出现错误“System.Windows.Forms.AxHost+InvalidActiveXStateException”的异常,解决的办法可以像这样:


         AxWindowsMediaPlayer ax1 = new AxWindowsMediaPlayer();
         Form f = new Form();
         f.Controls.Add(ax1);

         但是,这个Form不是按常规来创建的,据个人猜测是没有执行像CreateWindow类似的函数吧。所以它是没有句柄的,这样情况出现如下:
         在一个类库中想使用AxWindowsMediaPlayer,并且使用了多线程:

		 class DDX
		 {
			AxWindowsMediaPlayer ax1 = new AxWindowsMediaPlayer();
			Form f = new Form();//为了满足条件1

			public delegate void STARTSOUND(bool b);//委托,副线程中调用主线程上的组件

			public DDX()
			 {
				int i = f.Handle;//这是为了满足条件2,这样操作的作用是强制为f创建句柄,以使Invoke方法能执行
			 }
			 void button1_click(object o,EventArgs e)
			 {
				  new Thread(new ThreadStart(InmoitorFun)).start();
			 }
			 
			 void InmoitorFun()//因为是在线程中,所以要使用控件的Invoke来调用方法,ax1是在主线程中创建的
			 {
				  while(true)
				  {
					 ...
					 f.Invoke(new STARTSOUND(StartSound),new object[]{false});//一定要有前面的int i = f.Handle,不然会出现异常,Invoke方法执行的条件
					 ...
				  }
			 }
			 
			 void StartSound(bool b)
			 {
                  ((System.ComponentModel.ISupportInitialize)(this.ax1)).BeginInit();//还要进行初始化,为了满足第3个条件,
                  ((System.ComponentModel.ISupportInitialize)(this.ax1)).EndInit();				  
				  ax1.URL="F:\\1.mp3";
				  ax1.settings.setMode("loop",true);
				  ax1.play();
			 }
		 }

不是拖动到窗体上来使用AxWindowsMediaPlayer的话,比较麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值