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

C# 为SendMessage()编写WM_TOUCH消息,Kinect作为多点触控设备,c#,multi-touch,sendmessage,C#,Multi Touch,Sendmessage,在你把这篇文章标记为文章的副本之前,要知道我要求的是比这个问题的答案更清晰和具体 具体来说,我想知道如何在C#中构建消息并发送出去 关于它的文档(上面链接)说明了它由什么组成以及如何收集它发送的信息,但它没有说明如何实际构建WM#U TOUCH消息,而且我对C#的了解还不够,无法处理我能找到的内容 我知道它应该是这样的: [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int wMSg, In

在你把这篇文章标记为文章的副本之前,要知道我要求的是比这个问题的答案更清晰和具体

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

关于它的文档(上面链接)说明了它由什么组成以及如何收集它发送的信息,但它没有说明如何实际构建WM#U 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,它告诉我们在LPRAM中找到了多少个多触点。根据msdn页面,LPRAM本身“包含一个触摸输入句柄,可以在调用中使用该句柄来检索与此消息相关联的触摸点的详细信息”。GetTouchInputInfo函数返回结构


我的问题是如何在C++中建立TouChinPoT结构(因为文档是C++),以及如何通过函数传递这些信息,以便我可以将Kinect当作任何多点触摸应用中的通用多点触摸设备。

你需要在C代码中表示C++结构。 一旦有了C#结构,就可以将其用作输入或输出参数。
我发现转换这些结构的最佳方法是在以下位置使用P/Invoke Interop助手:

从您发布的链接复制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;
}

你需要在C++代码中表示C++结构。 一旦有了C#结构,就可以将其用作输入或输出参数。
我发现转换这些结构的最佳方法是在以下位置使用P/Invoke Interop助手:

从您发布的链接复制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;
}

感谢您帮助构建结构,但是我仍然需要处理返回结构的GetTouchInputInfo句柄。或者这不是一个问题,我可以将一个TOUCHINPUT结构数组作为LPRAM传递吗?嘿,Scott,您需要整理从C#(托管)到C/C++(非托管)的调用。请看这里:正在使用的SAFEARRAY方法。这将在C#中创建一个数组,然后使用CComSafeArray进行编组。Scott和/或blorkfish,你们两人是否知道如何创建有效的“触摸输入句柄”?它实际上只是一个指向一堆TOUCHINPUT结构的指针,还是类似的东西?如果你有一个答案,你可能会想给它在,我将非常感激!谢谢。感谢您帮助我构建结构,但是我仍然需要处理返回结构的GetTouchInputInfo句柄。或者这不是一个问题,我可以将一个TOUCHINPUT结构数组作为LPRAM传递吗?嘿,Scott,您需要整理从C#(托管)到C/C++(非托管)的调用。请看这里:正在使用的SAFEARRAY方法。这将在C#中创建一个数组,然后使用CComSafeArray进行编组。Scott和/或blorkfish,你们两人是否知道如何创建有效的“触摸输入句柄”?它实际上只是一个指向一堆TOUCHINPUT结构的指针,还是类似的东西?如果你有一个答案,你可能会想给它在,我将非常感激!谢谢