Я использую vlc для захвата видео и аудио потока и отображения его в графическом окне.Новый API libvlc больше не поддерживает двойной щелчок / полноэкранный режим в 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);
}
Обновление
Еще одна маленькая ошибка для тех, кто приходит из Google.В Windows 7, если вы прикрепите отладчик к обратному вызову, он будет поврежден.В ответах ловушки есть значение тайм-аута, если этот тайм-аут когда-либо истечет, ваш хук никогда не сработает снова в течение срока жизни ловушки.Из моего чтения видно, что это проблема Windows 7, хотя она работает на Windows Vista и менее.Точка останова в вашем отладчике наверняка заставит истечь этот тайм-аут, и в результате ваш обратный вызов будет вызван только один раз.Тем не менее, он будет работать нормально без точки останова.