【问题标题】:Inject/simulate WPF routed mouse click events注入/模拟 WPF 路由鼠标点击事件
【发布时间】:2011-09-25 18:28:20
【问题描述】:

我有一些直接的 WPF 3.5 控件来处理我需要在 Surface 应用程序 (SDK 1.0) 中使用的鼠标左键。我面临的问题是默认情况下不起作用。我正在考虑将每个控件包装在SurfaceContentControl 中,并将ContactTouchDownContactTapGesture 事件转换为相应的MouseDown 事件。

问题归结为 - 如何“注入”或模拟任意路由鼠标事件?我试过InputManager.Current.ProcessInput(),但没走多远。任何帮助表示赞赏。

【问题讨论】:

    标签: c# wpf pixelsense


    【解决方案1】:

    尝试使用 AutomationPeer 类。例如 ButtonAutomationPeer 用于 Button。下面的代码会发起一次点击。

    ButtonAutomationPeer peer = new ButtonAutomationPeer(button);
    IInvokeProvider provider = (IInvokeProvider)peer.GetPattern(PatternInterface.Invoke);
    provider.Invoke();
    

    【讨论】:

    • 谢谢。如果我想点击Path 或任何非Button 怎么办?如果我不想点击任何特别的东西,只想在 (X,Y) 上发送一个点击,看看谁得到它?如果您知道目标确实是 Button,那么您的解决方案就很好。
    【解决方案2】:

    evpo 的想法很有趣(尽管如果您使用自定义控件,它们很少带有 AutomationPeer 类)。

    您不能简单地通过向您的应用程序发送 WM_MOUSE* 事件来“注入”鼠标输入... WPF 确实会处理该消息,但是当它为该事件确定鼠标的位置时,它将查询 实际的鼠标 API,而不是尝试在 WM 中粘贴的内容。

    所以实际上你所能做的就是告诉窗口移动实际的鼠标光标并表现得好像按钮正在被单击/释放。您可以使用的一些代码位于http://www.codeproject.com/KB/system/globalmousekeyboardlib.aspx

    也就是说,虽然您在技术上可以做到这一点,但它很糟糕...您有一个昂贵的多点触控设备,但 1) 在其上显示鼠标光标 2) 将其任意部分限制为“单点触控” (并且一次只有一个任意部分和 3)想出一种任意方法来确定您将哪个手指视为鼠标控制手指

    【讨论】:

      猜你喜欢
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      相关资源
      最近更新 更多