gpt4 book ai didi

c# - 捕获鼠标在窗体上的任意位置单击(没有 IMessageFilter)

转载 作者:太空狗 更新时间:2023-10-29 22:26:34 24 4
gpt4 key购买 nike

当鼠标悬停在子控件上时,不会调用 MouseDown 事件。我尝试了 KeyPreview = true; 但它没有帮助(尽管它对 KeyDown - 键盘点击有用)。

我正在寻找类似 KeyPreview 的东西,但用于鼠标事件。

如果有更简单的方法,我宁愿不使用 IMessageFilter 来处理 WinAPI 消息。替代方案(此外,IMessageFilter 设置为Application-wide。我只想要Form-wide。)并遍历所有子控件,订阅每个子控件,有其自身的缺点。

最佳答案

您仍然可以使用 MessageFilter 并仅针对 ActiveForm 进行过滤:

private class MouseDownFilter : IMessageFilter {
public event EventHandler FormClicked;
private int WM_LBUTTONDOWN = 0x201;
private Form form = null;

[DllImport("user32.dll")]
public static extern bool IsChild(IntPtr hWndParent, IntPtr hWnd);

public MouseDownFilter(Form f) {
form = f;
}

public bool PreFilterMessage(ref Message m) {
if (m.Msg == WM_LBUTTONDOWN) {
if (Form.ActiveForm != null && Form.ActiveForm.Equals(form)) {
OnFormClicked();
}
}
return false;
}

protected void OnFormClicked() {
if (FormClicked != null) {
FormClicked(form, EventArgs.Empty);
}
}
}

然后在您的表单中附加它:

public Form1() {
InitializeComponent();
MouseDownFilter mouseFilter = new MouseDownFilter(this);
mouseFilter.FormClicked += mouseFilter_FormClicked;
Application.AddMessageFilter(mouseFilter);
}

void mouseFilter_FormClicked(object sender, EventArgs e) {
// do something...
}

关于c# - 捕获鼠标在窗体上的任意位置单击(没有 IMessageFilter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21312587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com