如何在不监听框架控件中定义的任何鼠标事件的情况下检测鼠标点击?

3

是否可能在不监听框架控件中定义的任何鼠标事件的情况下检测鼠标点击?

我的意思是,我不想像这样编写代码:

  control.MouseLeftButtonDown += this.HandleMouseLeftButtonDown;

我想知道用户是否在屏幕上点击了某个地方。在C#(WPF或Silverlight)中是否有可能实现?


1
如果不了解您究竟想要做什么以及为什么需要避免处理标准鼠标事件,那么很难思考出对这个问题的答案。您是想走一条艰难的路吗,还是有特定的设计考虑在起作用? - Cody Gray
@Code Gray:我想要实现这个功能:Silverlight中类似Google搜索框的实现 - Nawaz
@Nawaz:“那么我的问题基本上是:如何知道用户是否刚刚点击,并且单击事件发生在特定控件之外?”这不是完全重复吗? - Cody Gray
@Cody Gray:那个话题是关于某个特定的上下文环境。而这个话题则更为通用! - Nawaz
正如之前所暗示的,我认为上下文是使它成为一个真正问题的关键。除此之外,我不明白答案应该有什么不同。 - Cody Gray
@Cody Gray:在那个话题中,我的目标是为现有的SearchBox添加特定功能;我所提出的问题是“我的”想法;“我”认为如果我得到那个问题的答案,我就能解决这个问题。但是,了解上下文的参与者可能会向我建议替代方案,而不回答我的问题。这对我仍然有帮助。你明白我的意思吗?但是在这里,我提出了一个更一般性的问题。 - Nawaz
5个回答

8

例如,您可以在主窗口的静态构造函数中注册一个类处理程序:

static MainWindow() {
    EventManager.RegisterClassHandler(typeof (MainWindow),
                                      Mouse.MouseDownEvent,
                                      new MouseButtonEventHandler(OnGlobaMouseDown));
}

这将是所有MouseDown事件的全局处理程序。

1
不错,但缺点可能是处理程序需要是静态方法。此外,我可能会在注册方法中添加handledEventToo的布尔值,否则很少有事件会到达指定的处理程序。 - H.B.
如果用户在MainWindow之外单击怎么办?他可能会单击浏览器URL框或操作系统任务栏、Windows 7“开始”按钮等。 - Nawaz
@Nawaz - 如果你需要在WPF应用程序之外检测鼠标事件,我认为你将不得不使用Win API。请参考James Gaunt的答案。 - Pavlo Glazkov
您如何在Silverlight浏览器应用程序中完成这项操作? - John Zabroski

4

4

这是通过捕获鼠标来实现的。这会强制任何鼠标事件都被指向你,即使它移出窗口。使用Mouse.Capture()方法。


1
如果您需要处理应用程序中的所有鼠标事件,最好的方法是订阅InputManager事件。

0
“我的意思是,我不想编写这样的代码: control.MouseLeftButtonDown += this.HandleMouseLeftButtonDown;” 你可以使用以下方法:”
if (Mouse.LeftButton == MouseButtonState.Pressed)
{
     ...
}

你需要包含这个。

using System.Windows.Input;

这在WPF中对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接