c# WM_TOUCH WndProc 和 PreFilterMessage 中的消息

本文关键字:PreFilterMessage 消息 WndProc WM TOUCH | 更新日期: 2023-09-27 18:33:37

我正在尝试使用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;
        }
...

现在的问题是,PreFilterMessage LParamWndProc中的LParam不同,这在我尝试调用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,以便我可以调用GetTouchInputInfo

c# WM_TOUCH WndProc 和 PreFilterMessage 中的消息

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

相关文章:
  • 没有找到相关文章