Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
windows 8点击并保持事件c#_C#_Windows_Touch_Tap - Fatal编程技术网

windows 8点击并保持事件c#

windows 8点击并保持事件c#,c#,windows,touch,tap,C#,Windows,Touch,Tap,我正在尝试编写一个应用程序,当有人轻敲并握住某个东西时,它会感知。我正在使用windows窗体。我甚至试着用鼠标按下,但它似乎并没有一直开火。这也是一个多点触摸应用程序。我将有两个按钮,用户可以点击并按住一个按钮,同时按下另一个按钮。或者只按一个按钮。我甚至不知道windows窗体应用程序如何处理这个问题 在windows touch应用程序中看到的所有示例都使用xaml。这真的是唯一一种抓拍的方法吗 我基本上是在这里制作一个屏幕键盘,我认为如果没有windows窗体,这是不可能的。如果我错了,

我正在尝试编写一个应用程序,当有人轻敲并握住某个东西时,它会感知。我正在使用windows窗体。我甚至试着用鼠标按下,但它似乎并没有一直开火。这也是一个多点触摸应用程序。我将有两个按钮,用户可以点击并按住一个按钮,同时按下另一个按钮。或者只按一个按钮。我甚至不知道windows窗体应用程序如何处理这个问题

在windows touch应用程序中看到的所有示例都使用xaml。这真的是唯一一种抓拍的方法吗

我基本上是在这里制作一个屏幕键盘,我认为如果没有windows窗体,这是不可能的。如果我错了,请纠正我


非常感谢您在这方面的任何帮助或指导。谢谢。

如果您的程序在Windows 8上运行,您可以使用WM_指针API获取所需的输入。覆盖WndProc以捕获消息。您必须执行一些P/Invoke来让它工作,但这并不十分困难。下面是一些不完整的代码,您需要为要跟踪的每种类型的指针添加向上、向下和更新事件的案例。跟踪指针ID以处理多点触摸。要处理按住按钮的问题,您需要自己跟踪从WM_POINTERDOWN到WM_POINTERUP的时间,并采取相应的行动。希望这有帮助

public const int WM_POINTERDOWN = 0x0246;
public const int WM_POINTERUP = 0x0247;
public const int WM_POINTERUPDATE = 0x0245;

public enum POINTER_INPUT_TYPE : int
{
    PT_POINTER = 0x00000001,
    PT_TOUCH   = 0x00000002,
    PT_PEN     = 0x00000003,
    PT_MOUSE   = 0x00000004
}

public static uint GET_POINTERID_WPARAM(uint wParam) { return wParam & 0xFFFF; }

[DllImport("User32.dll")]
public static extern bool GetPointerType(uint pPointerID, out POINTER_INPUT_TYPE pPointerType);

protected override void WndProc(ref Message m)
{
    bool handled = false;
    uint pointerID;
    POINTER_INPUT_TYPE pointerType;
    switch(m.Message)
    {
        case WM_POINTERDOWN:
             pointerID = User32.GET_POINTERID_WPARAM((uint)m.WParam);
             if (User32.GetPointerType(pointerID, out pointerType))
             {
                 switch (pointerType)
                 {
                     case POINTER_INPUT_TYPE.PT_PEN:
                         // Stylus Down
                         handled = true;
                         break;
                     case POINTER_INPUT_TYPE.PT_TOUCH:
                         // Touch down
                         handled = true;
                         break;
                 }
             }
             break;
    }

    if (handled)
        m.Result = (IntPtr)1;

    base.WndProc(ref m);
}

这个问题已经存在了一段时间,可能会从一个简单的方法中受益。通过测量MouseDown事件和click事件(在MouseUp之前触发)之间的时间,可以模拟“点击并按住”(或点击并按住)。如果时间大于某个值,则取消单击并(可能)触发您自己的TapAndHold事件。我创建了一个测试控件,任何人都可以使用它来尝试这种方法。只需将UserControl添加到您的测试应用程序(我称之为我的TestTapAndHold),然后粘贴以下内容:

public partial class TestTapAndHold : UserControl
{
    private string showText = "Tap Me";
    private DateTime mouseDown;
    private const int holdTime = 500;
    public TestTapAndHold()
    {
        InitializeComponent();
        this.Paint += drawText;
    }
    public delegate void OnTapAndHold(EventArgs e);
    public event OnTapAndHold TapAndHold;
    private void drawText(object sender, PaintEventArgs e)
    {
        using (var drawBrush = new SolidBrush(Color.Black))
        {
            e.Graphics.DrawString(showText, Font, drawBrush, new Point(5,3));
        }
    }
    protected override void OnClick(EventArgs e)
    {
        if (DateTime.Now.Subtract(mouseDown).Milliseconds >= holdTime)
        {
            showText = "Tap Hold";
            TapAndHold?.Invoke(e);
        } else
        {
            base.OnClick(e);
            showText = "Tapped";
        }
        Invalidate();
    }
    private void TestTapAndHold_MouseDown(object sender, MouseEventArgs e)
    {
        mouseDown = DateTime.Now;
    }
}
构建应用程序,然后将其中一个测试控件弹出到窗体上。然后,您可以向表单中添加事件处理程序,如:

    private void testTapAndHold1_TapAndHold(EventArgs e)
    {
        MessageBox.Show("You tapped and Held");
    }

这种通用方法使我能够在运行在Microsoft Surface 4上的Windows窗体应用程序中添加“点击并按住”功能,这可能与我一直在寻找的如何在C中解释WM#U指针消息的方法重复!非常感谢。哦,等等,这会给我身份证。但是坐标呢?还有,你真的是这样得到身份证的吗?我认为WParam和LParam是指针。你不必取消对它们的引用?