在Visual Stdio.net中项目菜单中选择增加引用,翻到COM页,然后选择上ActiveMovie control type library,然后按下确定,在解决方案资源管理器的引用中就会出现QuartzTypeLib,我们只要在C#用 using QuartzTypeLib,就可以引用这个COM控件了。 播放一个媒体文件有三个步骤:   1. 创建图象过滤器的管理器(FGM)   2. 创建图象过滤器      3. 运行图象并且对事件进行反应。   代码如下: CleanUp(); m_objFilterGraph = new FilgraphManager(); m_objFilterGraph.RenderFile(openFileDialog.FileName); m_objBasicAudio = m_objFilterGraph as IBasicAudio; try { m_objVideoWindow = m_objFilterGraph as IVideoWindow; m_objVideoWindow.Owner = (int) panel1.Handle; m_objVideoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN; m_objVideoWindow.SetWindowPosition(panel1.ClientRectangle.Left, panel1.ClientRectangle.Top, panel1.ClientRectangle.Width, panel1.ClientRectangle.Height); } catch (Exception ex) { m_objVideoWindow = null; }  m_objMediaEvent = m_objFilterGraph as IMediaEvent; m_objMediaEventEx = m_objFilterGraph as IMediaEventEx; m_objMediaEventEx.SetNotifyWindow((int) this.Handle, WM_GRAPHNOTIFY, 0);  m_objMediaPosition = m_objFilterGraph as IMediaPosition; m_objMediaControl = m_objFilterGraph as IMediaControl;    CleanUp()函数是用来删除旧的对象的,如果它们存在的话。new FilterGraphManager是用来创建一个图象过滤器的管理器,而用RenderFile()方法来创建一个图象过滤器来对相应的文件进行处理。IBasicAudio 接口是用来控制音量和声音的平衡。  IVideoWindow接口是用来设置显示窗口的大小,位置和父窗口等属性。我们用一个try将其包括,是因为你打开一个音频文件,同时你又尝试去设置窗口的属性,那时就会发生错误。IMediaEvent和IMediaEventEx是用来作消息的处理,IMediaPosition接口来显示当前文件的播放时的位置,IMediaControl接口用是来控制媒体播放器的操作,比如播放,停止,暂停等,如果想要得更多关于接口方面的资料,请访问MSDN以下网址:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dx8_c/directx_cpp/htm/directshow.asp   初始化结束后,播放媒体就是很容易的事了,我们用IMediaControl对象(这里是m_objMediaControl)的Run()方法就可以开始播放媒体文件,Pause()实现暂停,Stop()实现停止。   最后我们要实现如何知道已经播放完毕,这个必须重载WndProc函数来实现窗体的消息回调函数,因此,我们必须在这个类中实现WndProc函数,同时用m_IMediaEventEx的方法SetNotifyWindow()来设定发回消息的窗体和要得到消息。当媒体播放结束后DirectX就会给窗口发EC_COMPLETE消息,我们处理这个消息就可以了,实现的代码如下: protected override void WndProc(ref Message m) {     if (m.Msg == WM_GRAPHNOTIFY)     {         int lEventCode;         int lParam1, lParam2;          while (true)         {             try             {                 m_objMediaEventEx.GetEvent(out lEventCode,                     out lParam1,                     out lParam2,                     0);                  m_objMediaEventEx.FreeEventParams(lEventCode, lParam1, lParam2);                  if (lEventCode == EC_COMPLETE)                 {                     m_objMediaControl.Stop();                     m_objMediaPosition.CurrentPosition = 0;                     m_CurrentStatus = MediaStatus.Stopped;                 }             }             catch (Exception)             {                 break;             }         }     }      base.WndProc(ref m); }