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

C# 如何在不侦听框架控件中定义的任何鼠标事件的情况下检测鼠标单击?,c#,wpf,silverlight,C#,Wpf,Silverlight,是否可以在不侦听框架控件中定义的任何鼠标事件的情况下检测鼠标单击 我的意思是,我不想写这样的代码: control.MouseLeftButtonDown += this.HandleMouseLeftButtonDown; 但我想知道用户是否点击屏幕。在C#(WPF或Silverlight)中是否可能?您可以使用Win32 API检测鼠标消息WM#u mouse,如下所示: 或者此示例显示全局鼠标消息WM_mouse_LL的用法: 您可以在主窗口的静态构造函数中注册类处理程序,例如:

是否可以在不侦听框架控件中定义的任何鼠标事件的情况下检测鼠标单击

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

  control.MouseLeftButtonDown += this.HandleMouseLeftButtonDown;

但我想知道用户是否点击屏幕。在C#(WPF或Silverlight)中是否可能?

您可以使用Win32 API检测鼠标消息WM#u mouse,如下所示:

或者此示例显示全局鼠标消息WM_mouse_LL的用法:


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

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

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

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

这是通过捕获鼠标来完成的。这将强制将任何鼠标事件定向到您,即使它移动到窗口之外。方法

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

  control.MouseLeftButtonDown += this.HandleMouseLeftButtonDown;
control.MouseLeftButtonDown+=此.HandleMouseLeftButtonDown;”

您可以随时使用:

if (Mouse.LeftButton == MouseButtonState.Pressed)
{
     ...
}
不过,您需要包括这一点

using System.Windows.Input;

这对我在wpf中很有用。

如果不更好地理解您到底想做什么,以及为什么您觉得需要避免处理标准鼠标事件,甚至很难考虑这个问题的答案。你只是想用艰难的方式做事,还是有一个特定的设计考虑因素在起作用?@Code Gray:我想这么做:@Nawaz:“所以我的问题基本上是:如何知道用户是否刚刚点击,点击事件是否发生在特定控件之外?”这怎么不是一个精确的复制品?@Cody Gray:这个话题是关于某个特定的背景。这个话题比较笼统!正如前面所暗示的,我觉得上下文才是真正的问题所在。除此之外,我不明白答案会有什么不同。很好,但缺点可能是处理程序需要是静态方法。另外,我可能会在register方法中添加
handleEvent的bool,因为否则很少有事件到达指定的处理程序。如果用户在MainWindow之外单击怎么办?他可以点击浏览器url框、操作系统任务栏、Windows 7
Start
按钮等?@Nawaz-如果您需要检测WPF应用程序之外的鼠标事件,我认为您必须使用Win API。请参阅James Gaunt的答案。如何在浏览器应用程序中为Silverlight做到这一点?