c# - Windows 8 点击并按住事件 C#

标签 c# windows touch tap

我正在尝试编写一个应用程序来感知何时有人点击并按住某物。我正在使用 Windows 窗体。我什至尝试使用鼠标按下,但它似乎并没有一直开火。这也将是一个多点触控应用程序。我将有两个按钮,用户可以点击并按住一个按钮,同时按下另一个按钮。或者只需按一个按钮。我什至不确定 Windows 窗体应用程序如何处理。

我看到的 Windows 触摸应用程序的所有示例都使用 xaml。这真的是捕获点击并按住的唯一方法吗??

我实际上是在制作屏幕键盘,我认为如果没有 Windows 窗体,这是不可能的。如果我在这里错了,请纠正我。

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

最佳答案

如果您的程序在 Windows 8 上运行,您可以使用 WM_POINTER 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);
}

关于c# - Windows 8 点击并按住事件 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15058824/

相关文章:

c# - 在 C# 中,我仍然可以在新线程中使用 Windows.Forms.Timers 吗?

windows - Babun 或 Cygwin 与 meteor

c# - 在 C# 中用于货币的最佳数据类型是什么?

c# - 使用 "this"关键字在 DataTable 中存储对对象的引用

windows - Apache 代理 - HTTP 到 HTTPS

jquery - First and Second touch a button,如何显示不同时间的图像?

iphone - 长按添加新 View 后如何保留触摸事件

iphone - 是否可以阻止触摸添加到队列中?

c# - 结构和结构集合的 volatile

c - "Error: unknown type name ..."在处理与二级 ADT 融合的一级 ADT 时。