将触摸识别为MouseDown事件

本文关键字:MouseDown 事件 识别 触摸 | 更新日期: 2023-09-27 18:05:52

我正在用c#, winforms为触摸屏构建一个益智游戏。

我能够在鼠标处理程序上处理触摸事件,事实上,我什么也没做,但它已经识别出我的触摸。然而,有一个问题,我不明白。mouse_down,只在我移动一点手指时发生,当我触摸屏幕时不识别。

有人遇到过这个问题吗?我应该实现一些触摸事件识别?如果有的话,你能给我一些文档或者例子吗?

Many Thanks in advance

将触摸识别为MouseDown事件

谢谢@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

希望对大家有帮助

一个听起来似乎合理的解决方案是重写WndProc并搜索WM_TOUCH事件。更多详细信息请访问:https://stackoverflow.com/a/15785333/3330348

为了正确地执行触摸操作,你不应该仅仅使用鼠标处理程序事件,因为触摸和使用鼠标处理程序是通过一个库来处理鼠标触摸,而不是你应该在游戏中使用的,你可以使用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);
    }

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