WM_GRAPHNOTIFY是否特定于所属FilterGraph?双FilterGraph播放技术咨询
好问题!咱们一步步拆解来看:
WM_GRAPHNOTIFY与FilterGraph的关联性
首先要明确:WM_GRAPHNOTIFY消息本身并不绑定特定的FilterGraph——它只是DirectShow用来给应用程序发信号的通用窗口消息,意思是“某个FilterGraph有事件要告诉你”。但真正区分事件来源的关键,是你调用MediaEventEx.SetNotifyWindow时传入的参数。
你的双FilterGraph场景适配分析
你现在的实现思路其实非常正确:每个面板单独初始化new QuartzTypeLib.FilgraphManager(),也就是各自拥有完全独立的FilterGraph实例,然后分别调用MediaEventEx.SetNotifyWindow把它们关联到同一个窗口,但传入了不同的lParam(面板ID 0或1)——这刚好能完美区分事件来自哪个FilterGraph:
- 当某个FilterGraph产生事件时,系统会给你指定的窗口发送WM_GRAPHNOTIFY,消息携带的
lParam就是你当时设置的面板ID。 - 你在窗口的消息处理函数里,只需要根据这个
lParam的值,找到对应的FilterGraph实例,再调用它的MediaEventEx.GetEvent就能拿到具体的事件内容了。
几个要注意的细节
- 每个FilterGraph的事件队列是完全独立的:哪怕两个FilterGraph都绑定到同一个窗口,它们的事件也不会混在一个队列里。你得针对每个FilterGraph实例单独处理它的事件队列——比如收到lParam为0的WM_GRAPHNOTIFY时,就去面板0对应的FilgraphManager的MediaEventEx里取事件;lParam为1时就处理面板1的。
- 别漏了处理事件队列:哪怕你觉得“现在可能没事件”,收到WM_GRAPHNOTIFY后也一定要调用
GetEvent清空队列,不然后续的事件通知可能会被卡住哦。
内容的提问来源于stack exchange,提问作者ulvesked
相关产品推荐
相关产品推荐

