WPF WIN32 hwndhost WM_MOUSEMOVE WM_MOUSEHOVER - PullRequest
1 голос
/ 25 марта 2010

У меня есть приложение WPF с пользовательским контролем, которое содержит HwndHost. HwndHost создается следующим образом:

  hwndHost = CreateWindowEx(0, "static", "",
                            WS_CHILD | WS_VISIBLE,
                            0, 0,
                            hostHeight, hostWidth,
                            hwndParent.Handle,
                            (IntPtr)HOST_ID,
                            IntPtr.Zero,
                            0);

  hwndControl = CreateWindowEx(0, "Static", "",
                                WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN
                                  ,
                                0, 0,
                                hostHeight, hostWidth,
                                hwndHost,
                                (IntPtr)PICTUREBOX_ID,
                                IntPtr.Zero,
                                0);

Затем я подключаюсь к насосу сообщений, используя HwndSourceHook, и через него проходит множество сообщений.

Кроме тех, которые мне нужны, т.е. WM_MOUSEMOVE, WM_MOUSEHOVER, WM_LBUTTONDOWN и WM_LBUTTONUP

Кроме того, событие OnMouseLeftButtonDown не запускается в коде WPF в главном окне или элементе управления, я полагаю, потому что Windows перехватывает его и выбрасывает.

Кто-нибудь знает, как я могу заставить их проходить, с использованием или без использования оконных сообщений WIN32?

Ответы [ 3 ]

3 голосов
/ 10 ноября 2010

Вам нужно обработать WM_NCHITTEST. Пока вы этого не сделаете, он не будет отправлять вам сообщения мыши.

// C++/CLI implementation of HwndHost.WndProc().
virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, bool% handled) override
{
    switch (msg)
    {
        case WM_NCHITTEST:
        {
            handled = true;
        return IntPtr(HTCLIENT);
        }
    }

    return IntPtr::Zero;
}
1 голос
/ 14 апреля 2010

Может показаться, что элемент Border в WPF предотвращает выброс OnMouseLeftButtonDown. Мое временное решение до тех пор, пока я не найду лучшего, это изменить границу WPF на кнопку WPF, после чего будут запущены все события мыши.

Не идеально для большинства людей, но, поскольку я использую его для рендеринга 3D на нем, не имеет значения, что находится под ним.

0 голосов
/ 25 марта 2010

Почему бы вам не зарегистрировать WndClass и не доставлять сообщения на ваш собственный WndProc вместо того, чтобы подключать рассылку сообщений? Я подозреваю, что вы получите гораздо лучшие результаты.

...