Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#捕获主窗体键盘事件_C#_Winforms - Fatal编程技术网

C#捕获主窗体键盘事件

C#捕获主窗体键盘事件,c#,winforms,C#,Winforms,如何捕获WinForm主窗体的键盘事件,其他控件在其中。 所以我想捕捉一个事件Ctrl+S,而不管焦点在哪里。 但是没有松果虫(钩子之类的…) 只有.NET管理的内部电源。具有可用于检测Ctrl+S的方法和事件方法 使用这些方法中的来确定按下了哪些键 编辑 确保启用Form.KeyPreview=true这样窗体将捕获事件,而不考虑焦点。处理窗体及其所有控件上的键 private void OnFormLoad(object sender, EventArgs e) { this.Key

如何捕获WinForm主窗体的键盘事件,其他控件在其中。 所以我想捕捉一个事件Ctrl+S,而不管焦点在哪里。 但是没有松果虫(钩子之类的…) 只有.NET管理的内部电源。

具有可用于检测Ctrl+S的方法和事件方法

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

编辑


确保启用
Form.KeyPreview=true
这样窗体将捕获事件,而不考虑焦点。

处理窗体及其所有控件上的

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");
        }
    }
}

试试这个代码。使用界面
IMessageFilter
可以过滤任何ctrl+键


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

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

你错过了“焦点在哪里无关紧要”的要求。你读过:“所以我想抓住一个事件Ctrl+S,焦点在哪里无关紧要”。请仔细阅读。您是否阅读了可能的副本:“所以我想捕捉一个事件Ctrl+S,而不管焦点在哪里”。请仔细阅读。@Robb:是的,我读过了,但我假设阶段
的焦点在哪里并不重要,它指的是表单内部或其控件,所以不管焦点在哪里,例如
textBox1
或表单中。这不是你的意思吗?@Robb:你注意到我之前评论中的问题了吗?Jalal,是的,我的意思是。。。但如果这个问题只是关于按键事件,那么我不会问。我以前应用过P/Invoke键盘钩子程序,Asish的答案正是我想要的。
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;
        }
    }
}