2017-02-21 127 views
0

我正在使用我的directshow应用程序作为进程库。 但是现在我需要将它作为单独的后台进程运行。 因此渲染表面在另一个进程上。 我将渲染表面(图片框)的句柄(hwnd)传递给后台进程。DirectShow自动调整大小

以前我有这个调整大小; (因为它是在同一过程中,我有机会直接控制)

...  
m_VideoControl.Resize += new EventHandler(VideoControl_Resize); 
... 

private void VideoControl_Resize(object sender, EventArgs e) 
     { 
      lock (m_csAsyncLock) 
      { 
       ResizeVideoWindow(); 
      } 
     } 

protected virtual void ResizeVideoWindow() 
     { 
      if (m_VideoWindow != null && m_VideoControl != null) 
      { 
       m_VideoWindow.SetWindowPosition(0, 0, m_VideoControl.Width, m_VideoControl.Height); 
      } 
     } 

但是现在我没有获得直接控制,所以我不能订阅VideoControl_Resize事件。 我只有控件的句柄。

如果外部控制调整大小,我该如何让视频重新调整大小?

如果可能的话,我不想SetWindowPosition函数之前使用新的过滤器,并解决它怎么样?

回答

1

如果你的视频渲染过滤器的实例在另一个进程的上下文中运行,您的调整大小处理程序需要通过发布信息或以其它方式使用进程间通信,而在其他的过程中,你要接收该事件控制传递给过程在视频渲染器运行的过程中,请致电IVideoWindow.SetWindowPosition

为了使其更方便,我就卸载不只是与视频渲染器的辅助处理的曲线图,也是一个托管窗口或控件。通过这种方式,父级UI处理程序通过常规方式调整子级的大小已足够,跨窗口之间将进行跨进程通信,并且辅助程序进程窗口将再次接收正常的UI消息和事件,使您能够以直接方式处理它们并管理它们您的DirectShow视频渲染器。

+0

嗨罗马,我设法得到当前的大小; RECT rec = new RECT(); GetWindowRect(m_VideoControlHandle,ref rec); m_VideoWindow.SetWindowPosition(0,0,rec.Right - rec.Left,rec.Bottom - rec.Top);如何在不使用过滤器的情况下在每个示例呈现中调用此方法? – AFgone

+0

让视频渲染器和托管UI在不同的进程中,你必须照顾进程间通信。也就是说,它并不是完全过滤,而是关于如何构建应用程序和UI处理程序。 –

+0

我有另一个(实际上是一些更多)示例应用程序,它是由其他人编写的并且是封闭源代码。但是我们知道它不使用任何类型的IPC,但它可以只使用hwnd自动调整视频窗口大小。设置计时器并不断查询GetWindowRect并调用SetWindowPosition是否不合适? – AFgone