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