【问题标题】:C# capture main form keyboard eventsC# 捕获主窗体键盘事件
【发布时间】:2014-04-28 22:31:03
【问题描述】:

如何捕捉 WinForm 主窗体的键盘事件,其他控件在哪里。 所以我想捕捉一个事件 Ctrl + S 并且焦点在哪里并不重要。 但没有 Pinvoke(钩子等......) 只有 .NET 管理内部电源。

【问题讨论】:

标签: c# winforms


【解决方案1】:

试试这个代码。使用接口IMessageFilter可以过滤任意ctrl+key。

public partial class Form1 : 
    Form,
    IMessageFilter
{
    public Form1()
    {
        InitializeComponent();

        Application.AddMessageFilter(this);
        this.FormClosed += new FormClosedEventHandler(this.Form1_FormClosed);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.RemoveMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m)
    {
        //here you can specify  which key you need to filter

        if (m.Msg == 0x0100 && (Keys)m.WParam.ToInt32() == Keys.S &&
            ModifierKeys == Keys.Control) 
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

我对此进行了测试并为我工作。

【讨论】:

    【解决方案2】:

    Form Class (System.Windows.Forms) 具有OnKeyDownOnKeyPressOnKeyUp 事件方法,可用于检测 Ctrl + S

    在这些方法中使用KeyEventArgs 来确定按下了哪些键

    编辑

    一定要启用Form.KeyPreview = true;,这样无论焦点如何,表单都会捕获事件。

    【讨论】:

    • 您错过了“无论焦点在哪里”的要求。
    • 您是否阅读过:“所以我想捕捉一个事件 Ctrl + S 并且不管焦点在哪里”。请仔细阅读。
    【解决方案3】:

    处理表单上的KeyDown 及其所有控件。

    private void OnFormLoad(object sender, EventArgs e)
    {
        this.KeyDown += OnKeyDown;
        foreach (Control control in this.Controls)
        {
            control.KeyDown += OnKeyDown;
        }
    }
    
    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control)
        {
            if (e.KeyValue == (int)Keys.S)
            {
                Console.WriteLine("ctrl + s");
            }
        }
    }
    

    【讨论】:

    • 您是否阅读过:“所以我想捕捉一个事件 Ctrl + S 并且不管焦点在哪里”。请仔细阅读。
    • @Robb:是的,我读到了,但我认为阶段 doesn't matter where focus is 指的是表单或其控件内部,所以无论焦点在哪里,例如 textBox1 或表格。不是你的意思吗?
    • @Robb:你注意到我之前评论的问题了吗?
    • Jalal,是的,我的意思是......但如果这个问题只是关于 KeyDown 事件,那么我不会问。我之前用过 P/Invoke Keyboard hook Proc,Asish 的回答正是我想要的。
    【解决方案4】:

    您可以添加一个 MenuStrip,然后创建一个名为 save 的菜单条项目,并给它一个快捷键 Ctrl + S。为此添加一个事件处理程序。即使焦点在表单上的其他控件上,它也会触发。如果您不喜欢看到 MenuStrip;你也可以设置 visible = false 。我必须承认这很丑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多