我使用我的directshow应用程序作为进程内库。 但是现在我需要将它作为单独的后台进程运行。 因此渲染表面是另一个过程。 我将渲染表面(图片框)的句柄(hwnd)传递给后台进程。
以前我有这个用于调整大小; (因为它在同一个过程中,我可以直接访问Control)
...
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函数之前那样解决它?
答案 0 :(得分:1)
如果您的视频渲染器过滤器实例正在另一个进程的上下文中运行,则Resize处理程序需要通过发布消息或以其他方式使用进程间通信将控制权传递给该进程,并在您要调用的其他进程中接收该事件{,1}},在视频渲染器运行的过程中。
为了使它更方便,我不仅可以将带有视频渲染器的图形卸载到辅助进程,还可以卸载托管窗口或控件。这样,父UI处理程序以通常的正常方式调整子进程的大小就足够了,在窗口之间进行跨进程通信,助手进程窗口将再次接收正常的UI消息和事件,让您直接处理它们并管理它们您的DirectShow视频渲染器。