【问题标题】:C# Application-Wide Left Mouse Click EventC# 应用程序范围的鼠标左键单击事件
【发布时间】:2019-05-02 22:42:36
【问题描述】:

我想在表单中的任意位置单击鼠标左键时播放声音,而不必在表单中的每个控件上放置鼠标单击事件。有没有办法做到这一点?

【问题讨论】:

  • 考虑查看 WPF 而不是 WinForms。 WPF 事件会自动冒泡到父控件,所以这很简单。

标签: c# winforms


【解决方案1】:

您可以使用 IMessageFilter 接口在将 Windows 通知分派到具有焦点的控件之前检测它。让它看起来像这样:

public partial class Form1 : Form, IMessageFilter {
    public Form1() {
        InitializeComponent();
        Application.AddMessageFilter(this);
        this.FormClosed += delegate { Application.RemoveMessageFilter(this); };
    }

    public bool PreFilterMessage(ref Message m) {
        // Trap WM_LBUTTONDOWN
        if (m.Msg == 0x201) {
            System.Diagnostics.Debug.WriteLine("BEEP!");
        }
        return false;
    }
}

这适用于您项目中的任何形式,而不仅仅是主要形式。

【讨论】:

  • 太棒了!谢谢!哦,对我来说鼠标左键的值是m.Msg == 0x0201
【解决方案2】:

这应该可以解决问题

const int WM_PARENTNOTIFY = 0x210;
const int WM_LBUTTONDOWN = 0x201;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_LBUTTONDOWN || (m.Msg == WM_PARENTNOTIFY && (int)m.WParam == WM_LBUTTONDOWN)) 
         DoIt();
    base.WndProc(ref m);
}

【讨论】:

  • 很棒的豆子。一直在寻找这个+太简单的年龄。干杯老兄。
【解决方案3】:

This project 可能对您的需求有点过分(因为它挂钩全局鼠标事件,而不仅仅是您的表单上的事件),但我认为它显示了您需要的基本知识。

【讨论】:

  • 偶尔全局挂钩鼠标或键盘很有用......但永远不要全局挂钩您可以在本地处理的内容。
【解决方案4】:

案例 WM_PARENTNOTIFY 选择案例 Wparam 案例 513 ' WM_LBUTTODOWN 播放声音A 结束选择

用于 Vb 或 Vba

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多