C#使用hook来绕过新的libvlc api

时间:2011-11-07 22:22:44

标签: c# .net winapi libvlc

我正在使用vlc捕获视频和音频流并将其显示在图片框中。新的libvlc api不再支持windows中的双击/全屏,我需要具备该功能。我在创建新表单时没有问题,在其中添加了一个图片框并在其中显示视频,但我在vlc窗口中捕获双击事件时遇到问题,以便告诉应用程序制作视频提供全屏。我发现我需要使用一个钩子。我安装了钩子,所有这些。我唯一的问题是,我只想处理这个消息,如果它是我的一个图片框中的点击。所以,从我的回调方法来看,这就是我需要的:

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 7问题,而它适用于Windows Vista及更少。调试器中的断点肯定会强制此超时到期,因此,您的回调只会被调用一次。但是,如果没有断点,它将正常工作。

1 个答案:

答案 0 :(得分:1)

您的lParam是指向MOUSEHOOKSTRUCT的指针,它将包含窗口句柄。

您可以使用Pinvoke.net定义并将lParam编组为该类型。