C # с помощью хука, чтобы обойти новый API libvlc - PullRequest
1 голос
/ 08 ноября 2011

Я использую 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 и менее.Точка останова в вашем отладчике наверняка заставит истечь этот тайм-аут, и в результате ваш обратный вызов будет вызван только один раз.Тем не менее, он будет работать нормально без точки останова.

1 Ответ

1 голос
/ 08 ноября 2011

Ваш lParam является указателем на MOUSEHOOKSTRUCT , который будет содержать дескриптор окна.

Вы можете использовать определение Pinvoke.net и маршал lParam для этого типа.

...