1

我正在使用 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);
    }

有任何想法吗?

更新日期

这是我现在得到的,好看吗?

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 及更低版本。调试器中的断点肯定会强制此超时到期,因此,您的回调只会被调用一次。但是,它可以在没有断点的情况下正常工作。

4

1 回答 1

1

lParam是一个指向包含窗口句柄 的MOUSEHOOKSTRUCT的指针。

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

于 2011-11-07T22:35:35.197 回答