C# Имитация мультитач с Kinect
У меня есть приложение Kinect, с помощью которого я могу генерировать 1-4 различных точки экрана (для левой / правой руки максимум для 2 человек), и я хотел бы иметь возможность отправлять каждое Point
к приложению с фокусом как мультитач сообщение.
Я сейчас пользуюсь SendInput
отправлять сообщения о перемещении мыши, мыши вниз и мыши вверх, но AFAIK не поддерживает WM_TOUCH
Сообщения.
Кто-нибудь знает простой способ отправки мультитач-сообщений в C#? В качестве теста я хотел бы иметь возможность использовать Kinect в MS Paint и рисовать обеими руками (а также всеми цветами ветра)
2 ответа
То, что вы хотите, это отправлять сообщения в соответствующее окно. Сообщение, которое вам нужно написать, это WM_TOUCH
сообщение. Вы можете найти очень полезную ветку обсуждения на WM_TOUCH
здесь
Надеюсь это поможет!
Я не думаю, что это сработает, если вы не сделали что-то, сохранив координаты x и y каждой руки людей, положив холст, затем изображение поверх него, затем 4 эллипса, например: затем масштабируйте их положение до стыков людей (как это сделать, смотрите 9-й канал). Тогда я бы скопировал координаты в
double
затем установить пиксели из них. Сделай это так.
double person1hand1x = Canvas.GetLeft(person1hand1);
double person1hand1y = Canvas.GetTop(person1hand1);
Затем я бы изменил цвет холста на основе этих действий с помощью элемента управления изображения. импортировать System.Drawing
ресурс в ваш проект, вам нужно будет установить пиксели, а затем создать Bitmap
и установите его пиксели как где x и y были. Сделайте это так:
Bitmap b = new Bitmap((int)image1.Width, (int)image1.Height); //set the max height and width
b.SetPixel(person1hand1x, person1hand1y, person1hand1.Fill); //set the ellipse fill so they can keep track of who drew what
image1.Source = ToBitmapSource(b); //convert to bitmap source... see https://stackru.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap/1470182#1470182 for more details
}
/// <summary>
/// Converts a <see cref="System.Drawing.Bitmap"/> into a WPF <see cref="BitmapSource"/>.
/// </summary>
/// <remarks>Uses GDI to do the conversion. Hence the call to the marshalled DeleteObject.
/// </remarks>
/// <param name="source">The source bitmap.</param>
/// <returns>A BitmapSource</returns>
public static BitmapSource ToBitmapSource(this System.Drawing.Bitmap source)
{
BitmapSource bitSrc = null;
var hBitmap = source.GetHbitmap();
try
{
bitSrc = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
catch (Win32Exception)
{
bitSrc = null;
}
finally
{
NativeMethods.DeleteObject(hBitmap);
}
return bitSrc;
}
internal static class NativeMethods
{
[DllImport("gdi32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool DeleteObject(IntPtr hObject);
}
Надеюсь это поможет! Примечание: я получил ToBitmapSource
из загрузки WPF BitmapImage из System.Drawing.Bitmap