C# WM_TOUCH Сообщения в WndProc и PreFilterMessage

Я экспериментирую с сообщениями WM_TOUCH для захвата сенсорных событий в моем приложении. Я хочу зарегистрировать, например, жест "3 пальца" и, поскольку это не было указано в WM_GESTURE, я начал экспериментировать с WM_TOUCH. Я нашел этот пример http://msdn.microsoft.com/en-us/library/windows/desktop/dd940546%28v=vs.85%29.aspx Проблема с примером заключается в том, что они используют WndProc, который работает только для индивидуальные формы. Я хочу уловить прикосновения во всем приложении, поэтому я попытался использовать PreFilterMessage вместо WndProc.

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public bool PreFilterMessage(ref Message m)
    {
        // Decode and handle WM_TOUCH message.
        bool handled;
        switch (m.Msg)
        {
            case WM_TOUCH:
                Debug.WriteLine("PreFilter TOUCH: " + m.ToString());
                handled = DecodeTouch(ref m);
                break;
            case 0x201:
                Debug.WriteLine("PreFilter LEFTMOUSEDOWN: " + m.ToString());
                handled = false;
                break;
            default:
                handled = false;
                break;
        }
...

Проблема сейчас в том, что LParam в PreFilterMessage отличается от LParam в WndProc что приводит к проблемам, когда я пытаюсь позвонить GetTouchInputInfo, Вот мой журнал отладки:

PreFilter TOUCH: msg=0x240 hwnd=0x530598 wparam=0x1 lparam=0x3ff0573 result=0x0
WndProc TOUCH: msg=0x240 hwnd=0x530598 wparam=0x1 lparam=0xf170000 result=0x0

PreFilter LEFTMOUSEDOWN: msg=0x201 (WM_LBUTTONDOWN) hwnd=0x530598 wparam=0x1 lparam=0x14100c1 result=0x0
WndProc LEFTMOUSEDOWN: msg=0x201 (WM_LBUTTONDOWN) hwnd=0x530598 wparam=0x1 lparam=0x14100c1 result=0x0

Почему LParam для мышиного ввода одинаковое, а для сенсорного ввода разное? Как я могу преобразовать LParam в PreFilterMessage, чтобы я мог вызвать GetTouchInputInfo?

1 ответ

Решение

Я закончил тем, что использовал другой подход, так как я не мог заставить это работать. Я использовал прозрачную форму в качестве наложения (как это), чтобы получить правильное сообщение. Таким образом, я получил правильный LParam. Также я мог бы переслать сообщение в окно под оверлеем, используя CallWindowProc с измененным hWnd, если мне нужно.

Другие вопросы по тегам