【问题标题】:Recognize touch as MouseDown event将触摸识别为 MouseDown 事件
【发布时间】:2014-05-29 18:15:02
【问题描述】:

我正在用 C# 构建一个益智游戏,用于触摸屏的 winforms。

我能够处理鼠标处理程序上的触摸事件,事实上,我什么也没做,但它已经识别了我的触摸。但是,有一个我无法弄清楚的问题。 mouse_down,仅在我移动一点手指时才会发生,并且在我触摸屏幕时无法识别。

有人遇到过这个问题吗? 我应该实现一些触摸事件识别吗?如果是这样,请您给我一些文档或示例吗?

提前致谢

【问题讨论】:

  • 你为什么要为此使用winforms? WPF,尤其是 Windows Metro,拥有更高级的触控支持。
  • 我认识 Bradley,但这必须在 winforms 中完成。我知道 wpf 会更好,而 winforms 并不是我正在实施的游戏或交互的最佳方式。然而,这是一个更大项目的一部分,我必须这样做:)
  • 我希望你能得到答案。如果我不得不猜测,微软从未打算在触摸环境中使用 WinForms,因此他们不太可能对它提供良好的支持。
  • ...说服项目负责人切换到 WPF 或 WinRT。
  • 也许它正在等待第二根手指?

标签: c# winforms touch


【解决方案1】:

感谢@PiotrWolkowski

你对我应该遵循的方式是正确的...... 出现了一些其他问题,但我解决了覆盖 WndProc 的初始问题,如下所示:

protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case Win32.WM_POINTERDOWN:
            case Win32.WM_POINTERUP:
            case Win32.WM_POINTERUPDATE:
            case Win32.WM_POINTERCAPTURECHANGED:
                break;

            default:
                base.WndProc(ref m);
                return;
        }
        int pointerID = Win32.GET_POINTER_ID(m.WParam);
        Win32.POINTER_INFO pi = new Win32.POINTER_INFO();
        if (!Win32.GetPointerInfo(pointerID, ref pi))
        {
            Win32.CheckLastError();
        }
        Point pt = PointToClient(pi.PtPixelLocation.ToPoint());
        MouseEventArgs me = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, pt.X, pt.Y, 0);
        switch (m.Msg)
        {
            case Win32.WM_POINTERDOWN:
                    Console.WriteLine("TOCOU" + pt);
                    (Parent as Jogo).Form1_MouseDown((this as object), me);
                break;

            case Win32.WM_POINTERUP:
                    Console.WriteLine("LEVANTOU");
                    (Parent as Jogo).Form1_MouseUp((this as object), me);
                break;

            case Win32.WM_POINTERUPDATE:
                    //Console.WriteLine("UPDATE");
                    (Parent as Jogo).Form1_MouseMove((this as object), me);
                break;
        }
    }

它得到了“Win32.cs”的支持,可以在这里下载:

https://gist.github.com/RSchwoerer/bc5c04899c0510aefca24f088a79cebf

希望这对你有帮助;)

【讨论】:

  • 非常好的解决方案。完美运行。
【解决方案2】:

一个听起来似乎可行的解决方案的建议是覆盖 WndProc 并搜索 WM_TOUCH 事件。更多细节在这里:https://stackoverflow.com/a/15785333/3330348

【讨论】:

    【解决方案3】:

    要正确执行触摸操作,您不应该使用鼠标处理程序事件,因为触摸和使用鼠标处理程序是通过一个库来处理鼠标触摸而不是您应该用于您能够注册的游戏您的应用程序使用user32.dll 中的方法处理触摸事件,下面是如何在您的应用程序中实现触摸处理的示例。

        [DllImport("user32.DLL")]
        public static extern bool RegisterTouchWindow(IntPtr hwnd, int ulFlags);
    
        [DllImport("user32.DLL")]
        public static extern bool UnregisterTouchWindow(IntPtr hwnd);
    
    
        public Form1()
        {
            InitializeComponent();
            RegisterTouchWindow(button1.Handle, 0);
        }
    
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            UnregisterTouchWindow(button1.Handle);
        }
    

    【讨论】:

    【解决方案4】:

    这可能是您的触摸屏驱动程序的问题。许多触摸屏驱动程序具有设置如何解释触摸并将其发送到 Windows 的实用程序。有时只需更新驱动程序即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多