Составляя сообщение WM_TOUCH для SendMessage(), Kinect как мультитач-устройство

Прежде чем пометить это как дубликат этого поста, знайте, что я прошу большей ясности и конкретности, чем ответ на этот вопрос.

В частности, я хочу знать, как в 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.

Мой вопрос заключается в том, как построить структуры TOUCHINPUT в C# (поскольку документация находится на C++), а также как передать эту информацию через функцию SendMessage(), чтобы я мог рассматривать kinect как обычное устройство с несколькими касаниями в любом мультисенсорном устройстве. сенсорное приложение.

1 ответ

Решение

Вам нужно будет представить структуру C++ в коде C#.
Если у вас есть структура C#, вы можете использовать ее в качестве входного или выходного параметра.
Лучший способ, который я нашел для преобразования этих структур, - это использование P/Invoke Interop Assistant по адресу: 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;
}
Другие вопросы по тегам