2017-02-21 96 views
0

Я использовал мое приложение 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?

ответ

1

Если ваш экземпляр фильтра рендеринга видео работает в контексте другого процесса, ваш обработчик Resize должен передать управление этому процессу, разместив сообщение или иным образом используя межпроцессную связь и получив событие в другом процессе, звоните IVideoWindow.SetWindowPosition там, в процессе, где выполняется рендеринг видео.

Чтобы сделать его более удобным, я бы разгрузил не только график с помощью рендеринга видео в вспомогательный процесс, но и окно хостинга или управление. Таким образом, для родительского обработчика пользовательского интерфейса достаточно обычным образом изменить размер дочерних элементов, между окнами будет происходить перекрестная передача процесса, а окно вспомогательного процесса будет получать снова обычные сообщения и события пользовательского интерфейса, позволяющие обрабатывать их прямым способом и управлять ваши видеообзоры DirectShow.

+0

Привет, Роман, мне удалось получить текущий размер; RECT rec = новый RECT(); GetWindowRect (m_VideoControlHandle, ref rec); m_VideoWindow.SetWindowPosition (0, 0, rec.Right - rec.Left, rec.Bottom - rec.Top); Как я могу сделать это для каждого образца без фильтра? – AFgone

+0

Имея видеорезервуар и пользовательский интерфейс для хостинга в разных процессах, вы должны позаботиться о межпроцессной коммуникации. То есть речь идет не о фильтрах, а о том, как вы структурируете свое приложение и обработчики пользовательского интерфейса. –

+0

У меня есть еще один (на самом деле еще несколько) пример приложений, написанный кем-то другим и закрытым. Но мы знаем, что он не использует какой-либо IPC, но он может автоматически изменять размер окна видео только с помощью hwnd. Неплохая идея установить таймер и постоянно запрашивать GetWindowRect и вызвать SetWindowPosition? – AFgone