是否有可能捕获Win7多点触控事件,将它们转换为鼠标和键盘事件并将它们发送到另一个应用程序?

时间:2010-07-29 11:17:30

标签: c# windows-7 events forwarding multi-touch

我有以下情况:我有一个特殊的3D程序,我需要能够在不改变程序本身的情况下对多点触摸事件作出反应。因此,我需要一个映射器程序,它接收Windows 7的多点触摸事件,在相应的鼠标和键盘事件中转换它们,并将这个模拟事件发送到3D程序,以便它可以处理这些事件。

我已经阅读并尝试了很多,我目前的方法是在3D程序上有一个几乎透明的覆盖窗口来捕捉多点触摸事件。但这也是问题,我无法设法以可用的方式将生成的鼠标事件转发到底层的3D程序。现在我使用pinvoke函数,如mouse_event,SendMessage等,但它们都不适合我。由于我总是需要将3D程序放在前面,然后发送事件,之后我需要将我的mapper程序重新放在前面。这很糟糕。

所以我的问题或多或少,是否有一个很好的工作方法来做我上面提到的事情?或者至少是一种将鼠标和键盘事件发送到后台进程的好方法?

希望有人能给我一个暗示或暗示......

以下是我现在模拟鼠标点击的方式:

    private void OnMouseDown(object sender, MouseEventArgs e)
    {    
        Point position = this.PointToScreen(new Point(e.Location.X, e.Location.Y));

        //Simulate the mouse event on the given position 
        this.Visible = false;

        Cursor.Position = position;
        mouse_event(Convert.ToUInt16(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);   
    }

    private void OnMouseUp(object sender, MouseEventArgs e)
    {
        Point position = this.PointToScreen(new Point(e.Location.X, e.Location.Y));

        //Simulate the mouse event on the given position 
        Cursor.Position = e.Location;
        mouse_event(Convert.ToUInt16(MouseEventFlags.LEFTUP), 0, 0, 0, 0);

        this.Visible = true;
    }

    //Get a handle to the mouse event manager
    [DllImport("user32.dll")]
    private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);

private void OnMouseDown(object sender, MouseEventArgs e) { Point position = this.PointToScreen(new Point(e.Location.X, e.Location.Y)); //Simulate the mouse event on the given position this.Visible = false; Cursor.Position = position; mouse_event(Convert.ToUInt16(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0); } private void OnMouseUp(object sender, MouseEventArgs e) { Point position = this.PointToScreen(new Point(e.Location.X, e.Location.Y)); //Simulate the mouse event on the given position Cursor.Position = e.Location; mouse_event(Convert.ToUInt16(MouseEventFlags.LEFTUP), 0, 0, 0, 0); this.Visible = true; } //Get a handle to the mouse event manager [DllImport("user32.dll")] private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);

2 个答案:

答案 0 :(得分:0)

或许可以查看InfoStrat.VE - Bing Maps 3D for WPF and Microsoft Surface。 他们使Bind地图控件可用于触摸。

也许这有帮助。

答案 1 :(得分:0)

没有办法将鼠标/键盘事件定向到Win32中的特定进程。尽管如此,你可能能够使这种方法起作用:

  1. 将您的映射器窗口注册为触摸窗口以获取触摸事件。
  2. 在消息循环中为WM_NCHITTEST添加处理程序,调用DefWindowProc()以获取默认处理程序,然后将任何HTCLIENT返回转换为HTTRANSPARENT。这将导致Windows通过您的窗口将任何鼠标事件传递到底层窗口。
  3. 如果您的映射器窗口与客户端程序位于不同的进程中,那么这可能不起作用;如果是这种情况,你将不得不使用AttachThreadInput做一些黑客攻击。顺便说一句,我不建议这样做,因为合并的线程队列很容易出错。