C#使用Kinect模拟多点触控

时间:2012-07-12 14:53:39

标签: c# kinect multi-touch

我有一个Kinect应用程序,我可以生成1-4个不同的屏幕点(左手/右手最多2个人),我希望能够将每个Point发送到具有焦点的应用程序多点触控消息。

我目前正在使用SendInput发送鼠标移动,鼠标按下和鼠标移动消息,但是AFAIK,它不支持WM_TOUCH消息。

有谁知道在C#中发送多点触控消息的简单方法?作为测试,我希望能够在MS Paint中使用Kinect,并用双手绘画(以及风的所有颜色)

2 个答案:

答案 0 :(得分:5)

你想要的是send messages到有问题的窗口。您需要撰写的消息是WM_TOUCH消息。您可以在WM_TOUCH here上找到一个非常有用的讨论主题。

希望这有帮助!

答案 1 :(得分:0)

我不认为这会有效,除非你做了一些事情,通过放下画布,然后在它上面放置一个图像来保存每个人手的x和y的坐标,然后是4个椭圆,例如:image1,然后将它们的位置缩放到人的关节,(参见Channel 9了解如何执行此操作)。然后我将坐标复制到double然后设置它们的像素。这样做。

double person1hand1x = Canvas.GetLeft(person1hand1);
double person1hand1y =  Canvas.GetTop(person1hand1);

然后我将使用Image控件根据这些操作更改画布的颜色。 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://stackoverflow.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);
    }

希望这有帮助! 注意:我从Load a WPF BitmapImage from a System.Drawing.Bitmap

获得ToBitmapSource