2012-08-22 69 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給我,我會非常感謝!謝謝。 –