2016-05-31 107 views
-3

我不想点击一个按钮或窗体,我只想知道当光标在窗体中时用户是否按下了鼠标左键。检测是否按下鼠标按钮和哪个WinForm c#

我已经试过这样:

private void PlayForm_KeyDown(object sender, KeyEventArgs e) 
{ 
    if(e.KeyCode == Keys.LButton) 
    { 
     ... 
    } 
} 

,但它不工作。

我也试过PlayForm_Click()但当点击是在“画布”,如果有在上面别的东西它只能是行不通

+10

'KeyDown'不是鼠标相关的事件。也许你想使用['MouseDown'](https://msdn.microsoft.com/en-us/library/ms171542(v = vs.110).aspx)? – Sinatr

+2

您将遇到与MouseDown相同的问题。无论您将鼠标悬停在哪个控件上,都将获得鼠标事件。如果这是一个按钮,它会得到鼠标事件。如果没有控制权,那将是形式本身。您需要在适当的控制下处理事件。 –

+0

@Sinatr否,它的行为与PlayForm_Click()相同 –

回答

0

,你可以使用鼠标进入/离开设置一个布尔值,该鼠标光标在窗体上,那么你可以使用鼠标。

... 
     bool mouseOverMe; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      mouseOverMe = false; 
     } 

     private void Window_MouseEnter(object sender, MouseEventArgs e) 
     { 
      mouseOverMe = true; 
     } 

     private void Window_MouseLeave(object sender, MouseEventArgs e) 
     { 
      mouseOverMe = false; 
     } 

     void doSomething() 
     { 
      if (Mouse.LeftButton == MouseButtonState.Pressed) 
       if (mouseOverMe) 
        MessageBox.Show("Im a mouse down in the window"); 
     } 
... 

东西就像这样。

0

据我所知,你需要一个处理程序来点击窗体中的任何东西。我建议你可以通过事件中的表单中的所有控件进行迭代,并为.Controls集合中存在的所有控件设置MouseClick(或KeyPressed或根据当前需要选择的事件)的常用处理程序。当表单被加载时,你应该为表单本身注册相同的处理程序(又名this.MouseClick)。如果稍后要为特定控件注册MouseClick处理程序,这将会有点矫枉过正,但您始终可以比较sender对象并从中获取数据。示例代码现在不存在,因为我正在使用手机进行输入。稍后更新。

0

主要问题是当消息直接发送到子控件时,表单不会收到任何消息。

解决这个问题的方法之一是注册一个应用程序范围的消息过滤器。请注意,下面的实现是相当低效(和相当难看),但它应该告诉你的基本思路:

void Main() 
{ 
    var form = new Form(); 
    form.Load += (s, _) => Application.AddMessageFilter(new MyFilter((Form)s)); 

    var pnl = new Panel(); 
    pnl.Controls.Add(new Button()); 
    form.Controls.Add(pnl); 

    Application.Run(form); 
} 

public class MyFilter : IMessageFilter 
{ 
    Form form; 

    public MyFilter(Form form) 
    { 
    this.form = form; 
    this.form.Disposed += (_, __) => Application.RemoveMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message msg) 
    { 
    const int WM_LMOUSEDOWN = 0x0201; 

    if (msg.Msg == WM_LMOUSEDOWN && msg.HWnd != IntPtr.Zero 
     && Control.FromHandle(msg.HWnd).TopLevelControl == form) 
    { 
     Console.WriteLine("Hi!"); 
    } 

    return false; 
    } 
} 
0

如果你只是想知道,如果鼠标左键向下,而执行在一些其他的代码形成你可以看看静态属性Control.MouseButtons,从MouseButtons枚举.Eg返回值:

if ((Control.MouseButtons & MouseButtons.Left) != 0)