none
多点触摸全局钩子问题 RRS feed

  • 问题

  • 现在做的Wpf项目里有一个这样的需求,有多个画面,其中一个是主画面,当在一定时间内非主画面上没有任何touch操作时,自动返回主画面,现在的想法是注册一个全局钩子来实现,有没有类似的例子可以参考的,还有就是有没有其它好的思路?

    2011年3月5日 6:13

答案

  • 如果在一个可视化树里可以用RouterEvent来传消息出来;如果不在可以定义一个static型的Event,全局来触发调用。

    2011年3月8日 7:10
  • 你好 zysc,

    我个人觉得如果你只是在同一个应用里面的多个画面间切换,并不需要挂到全局的钩子。WPF 4提供了 Touch 的相关事件,我们只需要一个计时器 (DispatcherTimer Class),然后来检测当前画面的 Touch 事件即可。 由于WPF提供了陆游事件机制,如果说这多个画面是在同一个可视树种的话,那么我们只需要处理上层元素的相应事件即可。

    如果说你要实现在系统层面的对于触摸消息的处理,那么挂在这个WM_TOUCH 消息上, 然后回调检测时间间隔。

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月7日 9:16
    版主
  • 你所关心的只是最顶层的那个元素的 Touch 事件 其它的你都不用关心,一点都不麻烦啊。因为底层的所有元素的 冒泡Touch事件都会被路由到最顶层(前提是你不能在底层随便的 e.Handled = true;)。

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已建议为答案 Jie BaoModerator 2011年3月13日 16:31
    • 已标记为答案 zysc 2011年3月15日 13:35
    2011年3月10日 9:41
    版主

全部回复

  • 这个帮你完成是不太现实的,不过我可以帮你确定一下你的方向,我觉得你的思路是可行的。这是一个正确的方向。
    Stay hungry, stay foolish
    2011年3月7日 6:54
  • 你好 zysc,

    我个人觉得如果你只是在同一个应用里面的多个画面间切换,并不需要挂到全局的钩子。WPF 4提供了 Touch 的相关事件,我们只需要一个计时器 (DispatcherTimer Class),然后来检测当前画面的 Touch 事件即可。 由于WPF提供了陆游事件机制,如果说这多个画面是在同一个可视树种的话,那么我们只需要处理上层元素的相应事件即可。

    如果说你要实现在系统层面的对于触摸消息的处理,那么挂在这个WM_TOUCH 消息上, 然后回调检测时间间隔。

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月7日 9:16
    版主
  • 谢谢两位的回复

    在我的映像里好像有些控件放在里层时,它所响应的有些事件是不会向上传的

    2011年3月7日 15:40
  • 如果在一个可视化树里可以用RouterEvent来传消息出来;如果不在可以定义一个static型的Event,全局来触发调用。

    2011年3月8日 7:10
  • 路由事件中,隧道和冒泡的传递方向不同,比如带有Preview前缀的事件一般都是隧道事件,它会从一个元素树的上层往下层路由。而和他相同的没有前缀的一般都是冒泡事件,会从下层往上层路由。具体说明你可以看下这个: http://msdn.microsoft.com/zh-cn/library/ms742806.aspx#routing_strategies

    当一个路由事件在中间层被设置了 e.Handled = true; 之后,这个事件就会终止路由。

     

    对于你的问题,我想还是应该把它简单地框在.Net 的范畴中,不要复杂的区使用全局钩子。通过事件来处理,像Allen说的,全局静态的一个事件也是可以帮你实现的,在计时器到点的时候,就触发这个静态的事件去交换画面。

     

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月8日 7:23
    版主
  • 不用钩子,如果一个画面嵌套很多子控件,用路由事件不是很麻烦吗?
    2011年3月10日 9:33
  • 你所关心的只是最顶层的那个元素的 Touch 事件 其它的你都不用关心,一点都不麻烦啊。因为底层的所有元素的 冒泡Touch事件都会被路由到最顶层(前提是你不能在底层随便的 e.Handled = true;)。

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已建议为答案 Jie BaoModerator 2011年3月13日 16:31
    • 已标记为答案 zysc 2011年3月15日 13:35
    2011年3月10日 9:41
    版主
  • 谢谢Bob Bao的回复
    2011年3月15日 13:35