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