- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当鼠标悬停在子控件上时,不会调用 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/
来自msdn看来 IMessageFilter 并不能处理所有异常,例如,在某些时候,办公应用程序会“挂起”其对象模型,此时它无法被调用并抛出:0x800AC472 (VBA_E_IGNORE ) 为
我正在研究 Word 自动化,为了消除“调用被被调用者拒绝”/“消息过滤器指示应用程序正忙”错误,我实现了 IMessageFilter。当我直接自动化 Word 时,消息过滤器就像一个魅力: Wor
我仍在尝试找出此错误的原因: OCR.test.IMessageFilter.PreFilterMessage(ref System.Windows.Forms.Message): containin
当鼠标悬停在子控件上时,不会调用 MouseDown 事件。我尝试了 KeyPreview = true; 但它没有帮助(尽管它对 KeyDown - 键盘点击有用)。 我正在寻找类似 KeyPrev
我想实现IOleMessageFilter,如下所述: How to: Fix 'Application is Busy' and 'Call was Rejected By Callee' Erro
我正在尝试使用 Python.net 在 Winforms 应用程序中添加自定义 IMessageFilter,但出现段错误。 这是一个最小的示例应用程序: import clr clr.AddRef
我是一名优秀的程序员,十分优秀!