2012-07-12 66 views
4

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

我目前使用SendInput送鼠标移动,按下鼠标和鼠标了消息,但据我所知,它不支持WM_TOUCH消息。

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

+0

请参阅http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c/7121314#7121314 – 2012-07-12 20:15:27

+0

谢谢,但那篇文章谈论鼠标消息,我需要发送触摸消息。你能发送多个鼠标信息吗?由此我可以在屏幕上放置多个鼠标吗? – 2012-07-12 20:30:21

+0

嗯....好点 – 2012-07-12 20:32:59

回答

5

你想要的是send messages有问题的窗口什么得到了ToBitmapSource。您需要撰写的消息是WM_TOUCH消息。你可以在WM_TOUCHhere找到一个非常有帮助的讨论线索。

希望这会有所帮助!

+0

它看起来很有前景!我会在下周尝试一下,并接受如果这有助于我让它工作:) – 2012-07-13 16:40:05

+0

当然 - 如果您指示此消息的窗口的消息循环不使用WM_TOUCH消息,则不会发生任何事情:) – Ani 2012-07-13 17:00:42

+0

是的,我将不得不为此测试,然后如果应用程序不处理触摸消息,则使主要附属物成为鼠标 – 2012-07-13 17:36:27

0

我不认为这会起作用,除非你做了一些事情保存每个人手的x和y的坐标,放下画布,然后放置一个图像,然后放置一个图像,然后是4个椭圆,如:image1,然后缩放它们到人体关节的位置(参见Channel 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://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

+0

感谢帖子!我已经有了每个附属物的X,Y坐标,并且它们在屏幕坐标系中。实际上,我试图将多点触控消息发送给具有焦点的应用程序。我不想重新创建一个绘画程序,我希望能够将我的Kinect变成一个通用的多点触控设备。 – 2012-07-13 14:49:46

+0

@joe_coolish不可能有多个鼠标。如果这就是你所说的,那么这幅画就是一个例子吗?或者,你正在努力完成什么 – 2012-07-13 14:50:57

+0

只是一个例子。就像本页如何使用MSPaint作为多点触摸显示器的测试一样:http://aperturering.hubpages.com/hub/MultiTouch-Test。最终目标是使Kinect成为多点触控设备 – 2012-07-13 14:54:41