2017-02-21 15 views
0

私は自分のdirectshowアプリをインプロセスライブラリとして使用していました。 しかし今は別のバックグラウンドプロセスとして実行する必要があります。 レンダリングサーフェスは別のプロセスにあります。 レンダリングサーフェイス(ピクチャボックス)のハンドル(hwnd)をバックグラウンドプロセスに渡しています。DirectShow Auto Resize

以前はサイズを変更していましたが、私はVideoControl_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); 
      } 
     } 

(それは同じプロセスにあったと私は直接コントロールへのアクセス権を持っているので)。 私はコントロールのハンドルしか持っていません。

外部コントロールのサイズを変更すると、ビデオのサイズを変更するにはどうすればよいですか?

可能であれば、私は新しいフィルタを使い、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

私は別の(実際には2つ以上の)サンプルアプリケーションを持っています。これは誰かが書いたもので、クローズドソースです。しかし、IPCを使用していないことがわかっていますが、hwndだけでビデオウィンドウのサイズを自動的に変更することができます。タイマーを設定しGetWindowRectを常にクエリしてSetWindowPositionを呼び出すことは悪い考えですか? – AFgone