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, если мне нужно.