none
他に開かれたアプリが移動した場合の検出方法は? RRS feed

  • 質問

  • よく動画キャプチャソフトウェアなどで、最初に録画するウィンドウを枠で選択します。

    ところが録画中に録画しているウィンドウを移動しても、録画範囲はついて来ないので、うまく録画が出来ません。

    本題ですが、自分のアプリをHIDEしてから、「CWnd::GetForegroundWindow」でもう一つ開いているアプリを取得して、キャプチャする範囲を設定したのですが、このメソッドでは「手前のウィンドウへのポインター。CWnd の一時オブジェクトである場合があります。」と書いているように、オブジェクトが保持されません。

    それでキャプチャするウィンドウが移動した場合、どうやってもう一度範囲を自動で検出できるでしょうか?

    Visual Studio 2008 Professional

    Windows 7 Home Premium

    Visual C++でMFC




    • 編集済み たけし 2014年5月24日 17:22
    2014年5月24日 17:19

回答

    • CWnd クラスの実態は、HWND 型のウィンドウハンドルに対する操作を実現したものです。
      CWnd クラスの一時的なオブジェクトが得られた場合、そこからハンドルを取りだして覚えておけばよいでしょう。GetSafeHwnd メンバー関数で得たものを覚えておき、CWnd::FromHandle に渡せばもう一度同じウィンドウを示す CWnd クラスのオブジェクトを得られます。
      逆に CWnd クラスに頼らず、::GetForegroundWindow や ::GetWindowRect というように Win32API を直接使えば、CWnd::FromHandle からやり直す必要はなくなるでしょう。
    • ウィンドウの移動検知はフックなどの難しいことを伴うと予想しますが、どの程度パワーをかけますか?
      定期的に ::GetWindowRect を実行するだけでもある程度カバーできるかと思います。
    • 回答としてマーク たけし 2014年5月25日 7:44
    2014年5月25日 0:07
    モデレータ

すべての返信

    • CWnd クラスの実態は、HWND 型のウィンドウハンドルに対する操作を実現したものです。
      CWnd クラスの一時的なオブジェクトが得られた場合、そこからハンドルを取りだして覚えておけばよいでしょう。GetSafeHwnd メンバー関数で得たものを覚えておき、CWnd::FromHandle に渡せばもう一度同じウィンドウを示す CWnd クラスのオブジェクトを得られます。
      逆に CWnd クラスに頼らず、::GetForegroundWindow や ::GetWindowRect というように Win32API を直接使えば、CWnd::FromHandle からやり直す必要はなくなるでしょう。
    • ウィンドウの移動検知はフックなどの難しいことを伴うと予想しますが、どの程度パワーをかけますか?
      定期的に ::GetWindowRect を実行するだけでもある程度カバーできるかと思います。
    • 回答としてマーク たけし 2014年5月25日 7:44
    2014年5月25日 0:07
    モデレータ
  • Azuleanさん、ありがとうございます。

    HWND  hWnd  = pCWnd->GetSafeHwnd();

    CWnd* pCWnd = CWnd::FromHandle( hWnd );

    としたらうまくいきました。

    でも最初、

    pCWnd->FromHandle(hWnd);

    としたらうまくいきませんでした。

    2014年5月25日 7:48
  • でも最初、

    pCWnd->FromHandle(hWnd);

    としたらうまくいきませんでした。

    C++ の言語仕様を学んでいただくと、なぜできないかがわかってくると思います。
    (参考:http://msdn.microsoft.com/ja-jp/library/yyh8hetw.aspx )

    2014年5月25日 8:21
    モデレータ