如何使Windows窗体控件响应DirectShow消息?

时间:2012-12-28 21:01:31

标签: .net winforms event-handling directshow

我正在使用Windows窗体构建一个带有播放列表的简单视频播放器。播放列表是一个ListBox控件,我使用DirectShow.NET库在PictureBox控件上播放视频。

一旦图片框中加载的视频停止播放,我需要播放列表来响应(开始播放下一个视频)。我知道DirectShow在媒体完成时发送消息EC_COMPLETE。 (对于DS.NET库,它通过简称为“EventCode.Complete”的枚举来实现)

如何构建一个触发事件,以便我的播放列表在EC_COMPLETE消息触发时响应?我一直在重读MSDN上的事件,代表和事件处理,Stack Overflow和各种其他地方,但是一切似乎都是为了处理已经内置到.NET中的事件。例如,按钮点击以及所有这些。

1 个答案:

答案 0 :(得分:1)

DirectShow.NET示例为您提供了如何捕获和处理EC_COMPLETE的示例。

例如,PlayWnd示例和\Samples\Players\PlayWnd\MainForm.cs文件:

    private void HandleGraphEvent()
    {
// ...
      // Process all queued events
      while(this.mediaEventEx.GetEvent(out evCode, out evParam1, out evParam2, 0) == 0)
      {
// ...
        if(evCode == EventCode.Complete)
        {

执行代码以响应感兴趣的事件。初始化包括将窗口句柄(其中一种方法)提供给Filter Graph Manager(FGM),以便在事件可用时发布窗口消息。然后,示例中的C#代码显示了如何通过WndProc处理它并传递给上面引用的片段。

这就是在FGM上启用整个事件发布的方式:

  // Have the graph signal event via window callbacks for performance
  hr = this.mediaEventEx.SetNotifyWindow(this.Handle, WMGraphNotify, IntPtr.Zero);