c#WM_TOUCH WndProc和PreFilterMessage中的消息

时间:2014-12-09 12:33:23

标签: c# winforms interop wndproc wm-touch

我正在尝试使用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中的PreFilterMessageLParam中的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相同,触摸输入不同?如何在PreFilterMessage中转换LParam以便我可以调用GetTouchInputInfo

1 个答案:

答案 0 :(得分:0)

我最终使用了一种不同的方法,因为我无法使用它。我使用透明表单作为叠加层(如this)来获取正确的消息。这样我得到了正确的LParam。另外,如果需要,我可以使用带有修改后的hWnd的CallWindowProc将消息转发到叠加层下面的窗口。