Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 如何为Windows窗体设置热键_C#_.net - Fatal编程技术网

C# 如何为Windows窗体设置热键

C# 如何为Windows窗体设置热键,c#,.net,C#,.net,我想在我的Windows窗体中设置热键。例如,Ctrl+N表示新表单,Ctrl+S表示保存。我该怎么做?首先,您需要处理事件,然后您可以开始注意修改器: private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.S) { /

我想在我的Windows窗体中设置热键。例如,Ctrl+N表示新表单,Ctrl+S表示保存。我该怎么做?

首先,您需要处理事件,然后您可以开始注意修改器:

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.S)
    {
        //Do whatever
    }
}

当然,您需要确保您的表单订阅了KeyDown事件。

我想要表单的
KeyDown事件和一些类似以下的代码:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData == (Keys.Control | Keys.N))
    {
        CreateNew();
    }
}
protected override bool ProcessCmdKey(ref Message message, Keys keys)
{
    switch (keys)
    {
        case Keys.B | Keys.Control | Keys.Alt | Keys.Shift:
            // ... Process Shift+Ctrl+Alt+B ...

            return true; // signal that we've processed this key
    }

    // run base implementation
    return base.ProcessCmdKey(ref message, keys);
}
设置

为事件创建处理程序:

处理程序示例:

    // Hot keys handler
    void Form_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.S)       // Ctrl-S Save
        {
            // Do what you want here
            e.SuppressKeyPress = true;  // Stops other controls on the form receiving event.
        }
    }

如果您试图将它们链接到应用程序中的菜单项,则不需要任何代码。在菜单项上,您只需设置快捷键属性,它将运行您为菜单项单击配置的相同事件。

如果需要,您也可以使用隐藏菜单进行设置。只需设置menu.visible=false的属性

您还可以在
表单
派生类型中重写
ProcessCmdKey
,如下所示:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData == (Keys.Control | Keys.N))
    {
        CreateNew();
    }
}
protected override bool ProcessCmdKey(ref Message message, Keys keys)
{
    switch (keys)
    {
        case Keys.B | Keys.Control | Keys.Alt | Keys.Shift:
            // ... Process Shift+Ctrl+Alt+B ...

            return true; // signal that we've processed this key
    }

    // run base implementation
    return base.ProcessCmdKey(ref message, keys);
}

我相信它更适合热键。不需要
KeyPreview

如果您的窗口有菜单,您可以使用
System.Windows.Forms.ToolStripMenuItem的
ShortcutKeys
属性:

myMenuItem.ShortcutKeys = Keys.Control | Keys.S;

在Visual Studio中,您也可以在菜单项的属性页中进行设置。

我想我应该在这里添加一个更新,因为最新的答案是5年前的。特别是关于菜单热键的问题部分,您可以通过设置
ShortcutKeys
属性来操作
MenuStrip.MenuItem
对象的属性。在Visual Studio中,通过打开
MenuStrip
对象的属性,可以在表单设计窗口中执行此操作。向下滚动到
ShortcutKeys
属性后,可以使用VS界面设置热键

如果希望菜单项的下划线为
MenuStrip
,请在所需热键的字符前面加上符号和(&)字符。因此,例如,如果希望在Exit的“x”上加下划线,则属性设置应为
E&xit

这些属性操作应产生与此类似的结果*:


*注意:要显示快捷键“Ctrl+N”,请将
ShowShortcutKeys
属性更改为
true

哦,您是对的。我忘了设置
KeyPreview
属性,这在这种情况下是必需的+回答得好。注意,使用较新的C#注册事件变得更容易,例如
this.KeyDown+=(objectsender,KeyEventArgs e)=>Form_KeyPress(sender,e,true);this.KeyUp+=(对象发送方,KeyEventArgs e)=>Form_按键(发送方,e,false)
将创建一个名为
Form_KeyPress
的处理程序,同时处理KeyDown和keydup,并使用一个额外的bool变量告知处理程序按键是按下还是释放的。它的签名是:
Form_Press(objectsender,KeyEventArgs e,bool pressed){…}
。这不是一个内置的方法。您可以创建这样一个方法,并将所有相关代码放入其中。