Я использовал мое приложение directshow как встроенную библиотеку. Однако теперь мне нужно запустить его как отдельный фоновый процесс. Таким образом поверхность рендеринга находится на другом процессе. Я передаю ручку (hwnd) поверхности рендеринга (picturebox) в фоновый процесс.DirectShow Auto Resize
Раньше у меня было это для изменения размера; (Так как это было в этом процессе, и у меня есть доступ к непосредственно контролю)
...
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?
Привет, Роман, мне удалось получить текущий размер; RECT rec = новый RECT(); GetWindowRect (m_VideoControlHandle, ref rec); m_VideoWindow.SetWindowPosition (0, 0, rec.Right - rec.Left, rec.Bottom - rec.Top); Как я могу сделать это для каждого образца без фильтра? – AFgone
Имея видеорезервуар и пользовательский интерфейс для хостинга в разных процессах, вы должны позаботиться о межпроцессной коммуникации. То есть речь идет не о фильтрах, а о том, как вы структурируете свое приложение и обработчики пользовательского интерфейса. –
У меня есть еще один (на самом деле еще несколько) пример приложений, написанный кем-то другим и закрытым. Но мы знаем, что он не использует какой-либо IPC, но он может автоматически изменять размер окна видео только с помощью hwnd. Неплохая идея установить таймер и постоянно запрашивать GetWindowRect и вызвать SetWindowPosition? – AFgone