1

vlcを使用して、ビデオとオーディオストリームをキャプチャし、画像ボックスに表示しています。新しいlibvlcapiは、Windowsでのダブルクリック/フルスクリーンをサポートしなくなりました。その機能が必要です。新しいフォームを作成し、それに画像ボックスを追加してその中にビデオを表示することに問題はありませんが、アプリにビデオを作成するように指示するために、vlcウィンドウでダブルクリックイベントをキャプチャすることに問題がありますフルスクリーンでフィードします。フックを使う必要があることがわかりました。フックを取り付けて、そのすべてを行います。私の唯一の問題は、メッセージボックスの1つがクリックされた場合にのみメッセージを処理したいということです。だから、私のコールバックメソッドから、これが私が必要とするものです:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 &&  MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
        {
            //Here I need to grab the Handle of the control that the mouse was clicked in.
            //Now I need to cast the Control.FromHandle() as PictureBox.
            // then if(control != null)
            // send the event to the form via. form.on_double_click or whatever.


        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

何か案は?

Ubdate

これが私が今持っているものです、よく見えますか?

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 &&  MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
        {
            MOUSEHOOKSTRUCT msg = (MOUSEHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MOUSEHOOKSTRUCT));

            PictureBox control = Control.FromHandle(msg.hwnd) as PictureBox;

            if (control != null)
            {
                PreviewForm.pbox_MouseDoubleClick(control, new MouseEventArgs(MouseButtons.Left, 2, msg.pt.x, msg.pt.y, 0));
            }                
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

アップデート

グーグルからやって来る人のためのもう一つの小さな落とし穴。Windows 7では、デバッガーをコールバックにアタッチすると、デバッガーが壊れているように見えます。フック応答にはタイムアウト値があります。そのタイムアウトが期限切れになった場合、フックの存続期間中、フックが再び起動することはありません。私の読書から、これはWindows Vista以下で動作するが、Windows7の問題であるように思われる。デバッガーのブレークポイントは、間違いなくこのタイムアウトを強制的に期限切れにし、その結果、コールバックは1回だけ呼び出されます。ただし、ブレークポイントがなくても正常に動作します。

4

1 に答える 1

1

あなたは、ウィンドウハンドルを含む MOUSEHOOKSTRUCTlParamへのポインタです。

Pinvoke.netの定義を使用して、lParamをそのタイプにマーシャリングできます。

于 2011-11-07T22:35:35.197 に答える