C# 将触摸识别为鼠标向下事件

C# 将触摸识别为鼠标向下事件,c#,winforms,touch,C#,Winforms,Touch,我正在用C#,winforms为触摸屏制作一个益智游戏 我能够在鼠标处理程序上处理触摸事件,事实上,我什么也没做,但它已经识别出我的触摸。然而,有一个问题我无法解决。鼠标按下时,只有当我的手指稍微移动一点时,才会发生,并且当我触摸屏幕时,无法识别这一瞬间 有没有人已经面对过这个问题? 我应该实现一些触摸事件识别吗?如果是这样的话,你能给我指一些文档或例子吗 事先非常感谢一个听起来似乎可行的解决方案是覆盖WndProc并搜索WM_触摸事件。更多详情请点击此处:谢谢@PiotrWolkowski 你

我正在用C#,winforms为触摸屏制作一个益智游戏

我能够在鼠标处理程序上处理触摸事件,事实上,我什么也没做,但它已经识别出我的触摸。然而,有一个问题我无法解决。鼠标按下时,只有当我的手指稍微移动一点时,才会发生,并且当我触摸屏幕时,无法识别这一瞬间

有没有人已经面对过这个问题? 我应该实现一些触摸事件识别吗?如果是这样的话,你能给我指一些文档或例子吗


事先非常感谢

一个听起来似乎可行的解决方案是覆盖WndProc并搜索WM_触摸事件。更多详情请点击此处:

谢谢@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”支持,可在此处下载:


希望这对您有所帮助;)

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

这可能是触摸屏驱动程序的问题。许多触摸屏驱动程序都有一些实用程序,用于设置如何解释触摸并将其发送到windows。有时只更新驱动程序就可以了。

为什么要使用winforms?WPF,尤其是windows metro,有更高级的触摸支持。我知道Bradley,但这必须在winforms中完成。我知道wpf会更好,winforms不是我正在实现的游戏或交互的最佳方式。然而,这是一个更大项目的一部分,我必须这样做:)我希望你能得到一个答案。如果我不得不猜测的话,微软从来没有打算在触摸环境中使用WinForms,所以他们不太可能对它有很好的支持。。。。说服项目负责人切换到WPF或WinRT。也许它正在等待第二个手指?非常好的解决方案。工作完美。请编辑您的答案并添加一些解释。避免只回答代码,请查看: