检测是否按下鼠标按钮和哪个WinForm c#
问题描述:
我不想点击一个按钮或窗体,我只想知道当光标在窗体中时用户是否按下了鼠标左键。检测是否按下鼠标按钮和哪个WinForm c#
我已经试过这样:
private void PlayForm_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.LButton)
{
...
}
}
,但它不工作。
我也试过PlayForm_Click()
但当点击是在“画布”,如果有在上面别的东西它只能是行不通
答
,你可以使用鼠标进入/离开设置一个布尔值,该鼠标光标在窗体上,那么你可以使用鼠标。
...
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");
}
...
东西就像这样。
答
据我所知,你需要一个处理程序来点击窗体中的任何东西。我建议你可以通过事件中的表单中的所有控件进行迭代,并为.Controls
集合中存在的所有控件设置MouseClick
(或KeyPressed或根据当前需要选择的事件)的常用处理程序。当表单被加载时,你应该为表单本身注册相同的处理程序(又名this.MouseClick
)。如果稍后要为特定控件注册MouseClick处理程序,这将会有点矫枉过正,但您始终可以比较sender
对象并从中获取数据。示例代码现在不存在,因为我正在使用手机进行输入。稍后更新。
答
主要问题是当消息直接发送到子控件时,表单不会收到任何消息。
解决这个问题的方法之一是注册一个应用程序范围的消息过滤器。请注意,下面的实现是相当低效(和相当难看),但它应该告诉你的基本思路:
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;
}
}
答
如果你只是想知道,如果鼠标左键向下,而执行在一些其他的代码形成你可以看看静态属性Control.MouseButtons
,从MouseButtons
枚举.Eg返回值:
if ((Control.MouseButtons & MouseButtons.Left) != 0)
'KeyDown'不是鼠标相关的事件。也许你想使用['MouseDown'](https://msdn.microsoft.com/en-us/library/ms171542(v = vs.110).aspx)? – Sinatr
您将遇到与MouseDown相同的问题。无论您将鼠标悬停在哪个控件上,都将获得鼠标事件。如果这是一个按钮,它会得到鼠标事件。如果没有控制权,那将是形式本身。您需要在适当的控制下处理事件。 –
@Sinatr否,它的行为与PlayForm_Click()相同 –