C# Имитация мультитач с Kinect

У меня есть приложение Kinect, с помощью которого я могу генерировать 1-4 различных точки экрана (для левой / правой руки максимум для 2 человек), и я хотел бы иметь возможность отправлять каждое Point к приложению с фокусом как мультитач сообщение.

Я сейчас пользуюсь SendInput отправлять сообщения о перемещении мыши, мыши вниз и мыши вверх, но AFAIK не поддерживает WM_TOUCH Сообщения.

Кто-нибудь знает простой способ отправки мультитач-сообщений в C#? В качестве теста я хотел бы иметь возможность использовать Kinect в MS Paint и рисовать обеими руками (а также всеми цветами ветра)

2 ответа

Решение

То, что вы хотите, это отправлять сообщения в соответствующее окно. Сообщение, которое вам нужно написать, это WM_TOUCH сообщение. Вы можете найти очень полезную ветку обсуждения на WM_TOUCH здесь

Надеюсь это поможет!

Я не думаю, что это сработает, если вы не сделали что-то, сохранив координаты x и y каждой руки людей, положив холст, затем изображение поверх него, затем 4 эллипса, например: image1 затем масштабируйте их положение до стыков людей (как это сделать, смотрите 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

Другие вопросы по тегам