2012-08-22 67 views
1

在将此标记为this后的副本之前,请知道我要求的问题比该问题的答案更具清晰度和特异性。为SendMessage(),Kinect作为多点触控设备编写WM_TOUCH消息

具体来说,我想知道如何在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

您将需要在C#代码中表示C++结构。
一旦你有一个C#结构,你可以使用它作为输入或输出参数。
我发现将这些结构的最佳方式是使用P/Invoke的互操作助理在: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; 
} 
+0

谢谢你如何构建结构,但我仍然需要解决返回结构的GetTouchInputInfo句柄。或者,这不是一个问题,我可以只传递一个TOUCHINPUT结构数组作为lParam? –

+1

嘿斯科特,你需要Marshall从C#(托管)到C/C++(非托管)的调用。看看这里:http://msmvps.com/blogs/gdicanio/正在使用SAFEARRAY方法。这将在C#中创建一个数组,然后使用CComSafeArray进行编组。 – blorkfish

+0

斯科特和/或blorkfish,你们都知道如何创建一个有效的“触摸输入句柄”?它实际上只是一个指向一堆TOUCHINPUT结构的指针,还是类似的东西?如果你有一个答案,你可能想要在http://stackoverflow.com/questions/15117490/creating-a-wm-touch-message-for-postmessage-in-c-sharp-net给我,我会非常感谢!谢谢。 –