2017-02-21 21 views
0

내 DirectShow 앱을 진행중인 라이브러리로 사용하고있었습니다. 그러나 지금은 별도의 백그라운드 프로세스로 실행해야합니다. 그래서 렌더링 표면이 다른 프로세스에 있습니다. 렌더 표면 (그림 상자)의 핸들 (hwnd)을 백그라운드 프로세스에 전달하고 있습니다.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을 호출하십시오.

좀 더 편리하게하기 위해 비디오 렌더러가있는 그래프뿐만 아니라 도우미 프로세스뿐 아니라 호스팅 윈도우 또는 컨트롤을 오프로드합니다. 이렇게하면 부모 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