为SendMessage()编写WM_TOUCH消息,Kinect作为多点触控设备

时间:2012-08-22 20:45:24

标签: c# multi-touch sendmessage

在您将此标记为this帖子的副本之前,请知道我要求的问题比该问题的答案更清晰,更具体。

具体来说,我想知道如何在C#中构建一条WM_TOUCH消息并将其发送出去。

上面的文档(上面链接)说明了它的组成以及如何收集它发送的信息,但它没有说明如何实际构建WM_TOUCH消息,而且我对C#的工作知之甚少我能找到的东西。

我知道它应该是这样的:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int wMSg, IntPtr wParam, IntPtr lParam);

/* code to make wParam and lParam */

SendMessage(HWND_BROADCAST, WM_TOUCH, _wParam, _lParam);

wParam将成为一个int,告诉我在lParam中找到多少个多点触控点。 lParam本身“包含一个触摸输入句柄,可用于调用GetTouchInputInfo,以根据msdn页面检索有关与此消息”相关联的触摸点的详细信息。 GetTouchInputInfo函数返回TOUCHINPUT结构。

我的问题是如何在C#中构建TOUCHINPUT结构(因为文档是在C ++中)以及如何通过SendMessage()函数传递该信息,以便我可以将kinect视为一般的多点触控任何多点触控应用中的设备。

1 个答案:

答案 0 :(得分:1)

您需要在C#代码中表示C ++结构 一旦有了C#结构,就可以将它用作输入或输出参数 我发现转换这些结构的最佳方法是使用P / Invoke Interop助手:http://clrinterop.codeplex.com/releases/view/14120

从您发布的链接复制TOUCHINPUT结构会产生以下输出:

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct TOUCHINPUT {
    /// LONG->int
    public int x;
    /// LONG->int
    public int y;
    /// HANDLE->void*
    public System.IntPtr hSource;
    /// DWORD->unsigned int
    public uint dwID;
    /// DWORD->unsigned int
    public uint dwFlags;
    /// DWORD->unsigned int
    public uint dwMask;
    /// DWORD->unsigned int
    public uint dwTime;
    /// ULONG_PTR->unsigned int
    public uint dwExtraInfo;
    /// DWORD->unsigned int
    public uint cxContact;
    /// DWORD->unsigned int
    public uint cyContact;
}