Составляя сообщение 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;
}