c#的菜单栏 为什么接收不到KeyDown事件呢

时间:2021-01-01 23:44:22
问个问题 c#的菜单栏 为什么接收不到KeyDown事件呢   
      private void menuStrip_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F1)
            {
                MessageBox.Show("121212");
            }
        }

在我选择了一个菜单项的时候 下面的menuStrip_KeyDown事件在按F1的时候没有执行
是怎么回事呢???高手帮忙看下

102 个解决方案

#1


在线等待。。。。。

#2


应该可以,先按Alt键焦点到MenuStrip,然后F1

#3


菜单栏默认是不能获得输入焦点的,所以不会触发键盘事件

#4


不行啊,点了ALT 键 菜单的下拉菜单就缩回去了啊 ,不如 文件 下面有 新建,保存,我点了文件,然后选择 新建 如果点ALT 文件的下拉项就缩回去了啊 

#5


搂主可以设置你的菜单项的ShortcutKeys属性为F1就可以响应,F1按键了

如果搂主想实现键盘事件,可以重写Form的ProcessDialogKey方法:

protected override bool ProcessDialogKey(Keys keyData)
{
            if (keyData == Keys.F1) 
            { 
                MessageBox.Show("121212"); 
            } 
}

#6


不能设置ShortcutKeys这个属性啊,就是这样不能满足公司的要求,他们的要求是这样的,当我的鼠标移到 比如说文件的 新建这个项时 点击f1 就得执行关于 新建 的帮助文档,,如果选中的 是 保存这一项点击F1 就得弹出 保存的 帮助文档 就是.chm 文档的特定的页

#7


你这个是做什么的哦...
如果是要做快捷键的话,把要设置的选项的Text设为名字(&快捷符).

如选文件一般为"文件(&F)",下拉有打开"打开(&O)".这样你可以用Alt+F选中文件,再按O就可以等价于点击打开了.

同时,可以直接设置选项的ShutcutKeys属性来给菜单设置快捷键.
比如有名为File选项,File.ShortcutKeys = Shortcut.F1;这样File的快捷键就是F1了.该属性在属性界面最下面杂项内可设.

另外,menuStrip_KeyDown应该是在menuStrip为活动控键时才激活的,一般用来拦截键盘输入事件

#8


不是做快捷键啊 ,就是做 当鼠标移动菜单的某一项的时候 按F1 必须的弹出 对应项的帮助文档,

#9


用来做帮助的话可以这样
在选项的单击事件里添加
                if (Control.MouseButtons == Keys.F1)
                {
                MessageBox.Show("121212"); 
                }

#10


怎么将menuStrip 设为活动控件呢??我现在就是想在鼠标移上去的时候 按f1 执行 menuStrip_KeyDown事件

#11


这样的话,搂主就按我5楼的代码就可以了,
在你的Form里面添加代码:
protected override bool ProcessDialogKey(Keys keyData) 

            if (keyData == Keys.F1) 
            { 
                MessageBox.Show("121212"); 
            } 
}

就可以完全实现你的需求

#12


        private void NewToolStripMenuItem_Click(object sender, EventArgs e)     //新建
        {
            if (Control.MouseButtons == Keys.F1)
            {
                    //帮助处理
            }
            else
            { 
                //正常处理
            }
        }

#13


就是说要单击一下选项才行啊 ??但是单击一下它就会执行单击事件了啊,比如单击新建 就要新建一个东西啊。而且公司不让做成单击的时候显示帮助,

#14


抱歉,我疏忽了,是下面这样,支持Shift/Ctrl/Alt+单击 


       private void NewToolStripMenuItem_Click(object sender, EventArgs e)     //新建
        {
            if (Control.ModifierKeys == Keys.Shift)
            {
                    //帮助处理
                MessageBox.Show("111");
            }
            else
            { 
                //正常处理
                MessageBox.Show("222");
            }
        }

#15


   private void NewToolStripMenuItem_Click(object sender, EventArgs e)    //新建 
        { 
            if (Control.MouseButtons == Keys.F1) 
            { 
                    //帮助处理 
            } 
            else 
            { 
                //正常处理 
            } 
        }

这段代码是在什么时候触发呢 ,是单击选项时还是在鼠标一上去按F1 的时候啊 ,不好意思啊 我还是个新手 不要嫌我麻烦啊

#16


按住Shift/Ctrl/Alt+单击就不会新建了

不单击就要判断光标位置了...
这个比较麻烦

#17


还有啊 ,上面的代码是工具栏的(ToolStrip) 的吗??? 我现在做的是menuStrip,菜单栏的

#18


正确代码是这个
      private void NewToolStripMenuItem_Click(object sender, EventArgs e)    //新建 
        { 
            if (Control.ModifierKeys == Keys.Shift) 
            { 
                    //按住Shift之后单击
                MessageBox.Show("111"); 
            } 
            else 
            { 
                //只是单击
                MessageBox.Show("222"); 
            } 
        }

#19


呵呵 就是不能用鼠标去单击 ,只能通过f1 调出每项对应的帮助

#20


是menuStrip啊

#21


名字是我的随手起的

#22


呵呵 可是功能分析上说明了不能用鼠标单击的,所以万恶哦头都搞大了 

#23


上面的代码是能完成帮助的功能,但公司就是不让做成那样,我都搞疯了

#24


        private void NewToolStripMenuItem_MouseEnter(object sender, EventArgs e)
        {
            if (Control.ModifierKeys == Keys.Shift)
            {
                //按住Shift之后再指向 
                MessageBox.Show("111");
            } 
        }

#25


然后,如果不满意的话,可以为F1键写一个事件.
当F1按下,
判断鼠标指针位置.获取该控件名称.
将该名称作为参数传个帮助方法.

帮助方法(控件名称)

以控件名称定位文档位置

#26


呵呵 公司不让那么做的,不然就可以用你的方法了。急死我了都

#27


还有其他的方案吗?

#28


        protected override bool ProcessCmdKey(ref   Message msg, Keys keyData)  
        {
            KeyEventArgs kea = new KeyEventArgs(keyData);
             if (kea.KeyCode==Keys.F1)    //F1按下
            {
                //判断鼠标指向并做响应处理,具体我也不会,貌似下拉框里不能判断鼠标位置
            }
            return true;
        }

#29


==我研究下,满有趣的

#30


ProcessCmdKey请问一下 这是个什么什么啊?我是直接在代码中加进这段代码就OK吗?

#31


需要在什么地方调用那个方法呢

#32


呵呵 好的 谢谢啊 。

#33


一种不成熟方案,主要是在下拉里不响应F1事件了

        string theMenuItem = "";    //菜单编号

        protected override bool ProcessCmdKey(ref   Message msg, Keys keyData)  //限制列输入模式
        {
            KeyEventArgs kea = new KeyEventArgs(keyData);
             if (kea.KeyCode==Keys.F1)    //F1按下
            {
                MessageBox.Show("关于“新建”的帮助");
                switch (theMenuItem)
                {
                    case "":
                        {
                            return true;
                        }
                    case "New":
                        {
                            MessageBox.Show("关于“新建”的帮助");
                            return true;
                        }
                        //给所有菜单编号并处理
                }
            }
            return true;
        }

        private void NewToolStripMenuItem_MouseEnter(object sender, EventArgs e)    //所有菜单都要这两个事件
        {
            theMenuItem = "New"; //不同菜单设置不同编号

        }

        private void NewToolStripMenuItem_MouseLeave(object sender, EventArgs e)
        {
            theMenuItem = ""; //离开置零,下一个菜单有下一个菜单的MouseEnter事件处理            
        }

#34


ProcessCmdKey直接加就行,用来处理键盘事件的

#35


对啊 就是在下拉里不响应任何按键事件,上面的代码我页是这么写的,在进入的时候记录编号,离开的时候清除编号。但公司的要求就是在我鼠标进入 没离开的时候 按F1 执行显示帮助。真的太郁闷了,就是找不出办法相应在下拉里的按键事件。我从网上看的说是用全局钩子Hook做,可是我对钩子一点概念都没有搞不出来啊

#36


刚才上面的代码也是不能响应 在下拉 菜单时按键的事件的

#37


全局只有一个帮助菜单,随你放哪

        string theMenuItem = "";    //菜单编号

        private void NewToolStripMenuItem_MouseEnter(object sender, EventArgs e)    //所有菜单都要这两个事件
        {
            helpToolStripMenuItem1.ShortcutKeys = Keys.F1;//加到private void MainForm_Load(object sender, EventArgs e)里
            theMenuItem = "New"; //不同菜单设置不同编号
        }

        private void NewToolStripMenuItem_MouseLeave(object sender, EventArgs e)
        {
            theMenuItem = ""; //离开置零,下一个菜单有下一个菜单的MouseEnter事件处理            
        }

        private void helpToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            switch (theMenuItem)
            {
                case "":
                    {
                        break;
                    }
                case "New":
                    {
                        MessageBox.Show("关于“新建”的帮助");
                        break;
                    }
                //给所有菜单编号并处理
            }
        }

#38


这样就可以了,我测试通过

#39


是吗 ???太激动了,, 我试试先,今晚辛苦你了。分就给你了,等会儿就给分啊,,呵呵 谢谢

#40


等等      helpToolStripMenuItem1.ShortcutKeys = Keys.F1;//加到private void MainForm_Load(object sender, EventArgs e)里 
这句话是什么意思啊 ???

#41


事实证明我错了,一旦下拉了某列彩旦所有的键盘事件都将只在该下拉列里搜索符合条件的快捷键,无视外部响应,所以要在每个列里都加一个帮助,但是可以让所有帮助响应同一个帮助的事件

#42


没有看明白你的意思? 所以要在每个列里都加一个帮助 这句是什么意思呢?

#43


helpToolStripMenuItem1.ShortcutKeys = Keys.F1;是把helpToolStripMenuItem1的快捷键设为F1,在窗体创建时加载就可以了.也可以直接在窗体设计器的属性里改

#44


就是说是菜单的每一项,而不是每一项的下拉项??

#45


假设文件里有新建\保存\打印,现在要再加个帮助.其他的列都要加.
然后把所有的帮助的Click设为同一个事件,ShortcutKeys也都Keys.F1;

#46


怎么再加个帮助啊,没明白,不是拖个helpprovide 上去吗?加个帮助是这个意思吗(新建\保存\打印\帮助)??什么是所有的帮助??不好意思 真的没明白,能再解释一下吗?谢谢

#47


这样最简单,右击选项则弹出帮助,左击是正常操作  


      private void NewToolStripMenuItem_Click(object sender, EventArgs e)     //新建
        {
            //
            MessageBox.Show("新建完成");
        }

        private void NewToolStripMenuItem_MouseDown(object sender, MouseEventArgs e)
        {
            if (Control.MouseButtons == MouseButtons.Right)
            {
                //右击帮助
                MessageBox.Show("关于“新建”的帮助");
            }
        }

#48


呵呵 代码是对的 可是我不能用啊,公司不让啊

#49


你还在加班么?

#50


是啊 

#1


在线等待。。。。。

#2


应该可以,先按Alt键焦点到MenuStrip,然后F1

#3


菜单栏默认是不能获得输入焦点的,所以不会触发键盘事件

#4


不行啊,点了ALT 键 菜单的下拉菜单就缩回去了啊 ,不如 文件 下面有 新建,保存,我点了文件,然后选择 新建 如果点ALT 文件的下拉项就缩回去了啊 

#5


搂主可以设置你的菜单项的ShortcutKeys属性为F1就可以响应,F1按键了

如果搂主想实现键盘事件,可以重写Form的ProcessDialogKey方法:

protected override bool ProcessDialogKey(Keys keyData)
{
            if (keyData == Keys.F1) 
            { 
                MessageBox.Show("121212"); 
            } 
}

#6


不能设置ShortcutKeys这个属性啊,就是这样不能满足公司的要求,他们的要求是这样的,当我的鼠标移到 比如说文件的 新建这个项时 点击f1 就得执行关于 新建 的帮助文档,,如果选中的 是 保存这一项点击F1 就得弹出 保存的 帮助文档 就是.chm 文档的特定的页

#7


你这个是做什么的哦...
如果是要做快捷键的话,把要设置的选项的Text设为名字(&快捷符).

如选文件一般为"文件(&F)",下拉有打开"打开(&O)".这样你可以用Alt+F选中文件,再按O就可以等价于点击打开了.

同时,可以直接设置选项的ShutcutKeys属性来给菜单设置快捷键.
比如有名为File选项,File.ShortcutKeys = Shortcut.F1;这样File的快捷键就是F1了.该属性在属性界面最下面杂项内可设.

另外,menuStrip_KeyDown应该是在menuStrip为活动控键时才激活的,一般用来拦截键盘输入事件

#8


不是做快捷键啊 ,就是做 当鼠标移动菜单的某一项的时候 按F1 必须的弹出 对应项的帮助文档,

#9


用来做帮助的话可以这样
在选项的单击事件里添加
                if (Control.MouseButtons == Keys.F1)
                {
                MessageBox.Show("121212"); 
                }

#10


怎么将menuStrip 设为活动控件呢??我现在就是想在鼠标移上去的时候 按f1 执行 menuStrip_KeyDown事件

#11


这样的话,搂主就按我5楼的代码就可以了,
在你的Form里面添加代码:
protected override bool ProcessDialogKey(Keys keyData) 

            if (keyData == Keys.F1) 
            { 
                MessageBox.Show("121212"); 
            } 
}

就可以完全实现你的需求

#12


        private void NewToolStripMenuItem_Click(object sender, EventArgs e)     //新建
        {
            if (Control.MouseButtons == Keys.F1)
            {
                    //帮助处理
            }
            else
            { 
                //正常处理
            }
        }

#13


就是说要单击一下选项才行啊 ??但是单击一下它就会执行单击事件了啊,比如单击新建 就要新建一个东西啊。而且公司不让做成单击的时候显示帮助,

#14


抱歉,我疏忽了,是下面这样,支持Shift/Ctrl/Alt+单击 


       private void NewToolStripMenuItem_Click(object sender, EventArgs e)     //新建
        {
            if (Control.ModifierKeys == Keys.Shift)
            {
                    //帮助处理
                MessageBox.Show("111");
            }
            else
            { 
                //正常处理
                MessageBox.Show("222");
            }
        }

#15


   private void NewToolStripMenuItem_Click(object sender, EventArgs e)    //新建 
        { 
            if (Control.MouseButtons == Keys.F1) 
            { 
                    //帮助处理 
            } 
            else 
            { 
                //正常处理 
            } 
        }

这段代码是在什么时候触发呢 ,是单击选项时还是在鼠标一上去按F1 的时候啊 ,不好意思啊 我还是个新手 不要嫌我麻烦啊

#16


按住Shift/Ctrl/Alt+单击就不会新建了

不单击就要判断光标位置了...
这个比较麻烦

#17


还有啊 ,上面的代码是工具栏的(ToolStrip) 的吗??? 我现在做的是menuStrip,菜单栏的

#18


正确代码是这个
      private void NewToolStripMenuItem_Click(object sender, EventArgs e)    //新建 
        { 
            if (Control.ModifierKeys == Keys.Shift) 
            { 
                    //按住Shift之后单击
                MessageBox.Show("111"); 
            } 
            else 
            { 
                //只是单击
                MessageBox.Show("222"); 
            } 
        }

#19


呵呵 就是不能用鼠标去单击 ,只能通过f1 调出每项对应的帮助

#20


是menuStrip啊

#21


名字是我的随手起的

#22


呵呵 可是功能分析上说明了不能用鼠标单击的,所以万恶哦头都搞大了 

#23


上面的代码是能完成帮助的功能,但公司就是不让做成那样,我都搞疯了

#24


        private void NewToolStripMenuItem_MouseEnter(object sender, EventArgs e)
        {
            if (Control.ModifierKeys == Keys.Shift)
            {
                //按住Shift之后再指向 
                MessageBox.Show("111");
            } 
        }

#25


然后,如果不满意的话,可以为F1键写一个事件.
当F1按下,
判断鼠标指针位置.获取该控件名称.
将该名称作为参数传个帮助方法.

帮助方法(控件名称)

以控件名称定位文档位置

#26


呵呵 公司不让那么做的,不然就可以用你的方法了。急死我了都

#27


还有其他的方案吗?

#28


        protected override bool ProcessCmdKey(ref   Message msg, Keys keyData)  
        {
            KeyEventArgs kea = new KeyEventArgs(keyData);
             if (kea.KeyCode==Keys.F1)    //F1按下
            {
                //判断鼠标指向并做响应处理,具体我也不会,貌似下拉框里不能判断鼠标位置
            }
            return true;
        }

#29


==我研究下,满有趣的

#30


ProcessCmdKey请问一下 这是个什么什么啊?我是直接在代码中加进这段代码就OK吗?

#31


需要在什么地方调用那个方法呢

#32


呵呵 好的 谢谢啊 。

#33


一种不成熟方案,主要是在下拉里不响应F1事件了

        string theMenuItem = "";    //菜单编号

        protected override bool ProcessCmdKey(ref   Message msg, Keys keyData)  //限制列输入模式
        {
            KeyEventArgs kea = new KeyEventArgs(keyData);
             if (kea.KeyCode==Keys.F1)    //F1按下
            {
                MessageBox.Show("关于“新建”的帮助");
                switch (theMenuItem)
                {
                    case "":
                        {
                            return true;
                        }
                    case "New":
                        {
                            MessageBox.Show("关于“新建”的帮助");
                            return true;
                        }
                        //给所有菜单编号并处理
                }
            }
            return true;
        }

        private void NewToolStripMenuItem_MouseEnter(object sender, EventArgs e)    //所有菜单都要这两个事件
        {
            theMenuItem = "New"; //不同菜单设置不同编号

        }

        private void NewToolStripMenuItem_MouseLeave(object sender, EventArgs e)
        {
            theMenuItem = ""; //离开置零,下一个菜单有下一个菜单的MouseEnter事件处理            
        }

#34


ProcessCmdKey直接加就行,用来处理键盘事件的

#35


对啊 就是在下拉里不响应任何按键事件,上面的代码我页是这么写的,在进入的时候记录编号,离开的时候清除编号。但公司的要求就是在我鼠标进入 没离开的时候 按F1 执行显示帮助。真的太郁闷了,就是找不出办法相应在下拉里的按键事件。我从网上看的说是用全局钩子Hook做,可是我对钩子一点概念都没有搞不出来啊

#36


刚才上面的代码也是不能响应 在下拉 菜单时按键的事件的

#37


全局只有一个帮助菜单,随你放哪

        string theMenuItem = "";    //菜单编号

        private void NewToolStripMenuItem_MouseEnter(object sender, EventArgs e)    //所有菜单都要这两个事件
        {
            helpToolStripMenuItem1.ShortcutKeys = Keys.F1;//加到private void MainForm_Load(object sender, EventArgs e)里
            theMenuItem = "New"; //不同菜单设置不同编号
        }

        private void NewToolStripMenuItem_MouseLeave(object sender, EventArgs e)
        {
            theMenuItem = ""; //离开置零,下一个菜单有下一个菜单的MouseEnter事件处理            
        }

        private void helpToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            switch (theMenuItem)
            {
                case "":
                    {
                        break;
                    }
                case "New":
                    {
                        MessageBox.Show("关于“新建”的帮助");
                        break;
                    }
                //给所有菜单编号并处理
            }
        }

#38


这样就可以了,我测试通过

#39


是吗 ???太激动了,, 我试试先,今晚辛苦你了。分就给你了,等会儿就给分啊,,呵呵 谢谢

#40


等等      helpToolStripMenuItem1.ShortcutKeys = Keys.F1;//加到private void MainForm_Load(object sender, EventArgs e)里 
这句话是什么意思啊 ???

#41


事实证明我错了,一旦下拉了某列彩旦所有的键盘事件都将只在该下拉列里搜索符合条件的快捷键,无视外部响应,所以要在每个列里都加一个帮助,但是可以让所有帮助响应同一个帮助的事件

#42


没有看明白你的意思? 所以要在每个列里都加一个帮助 这句是什么意思呢?

#43


helpToolStripMenuItem1.ShortcutKeys = Keys.F1;是把helpToolStripMenuItem1的快捷键设为F1,在窗体创建时加载就可以了.也可以直接在窗体设计器的属性里改

#44


就是说是菜单的每一项,而不是每一项的下拉项??

#45


假设文件里有新建\保存\打印,现在要再加个帮助.其他的列都要加.
然后把所有的帮助的Click设为同一个事件,ShortcutKeys也都Keys.F1;

#46


怎么再加个帮助啊,没明白,不是拖个helpprovide 上去吗?加个帮助是这个意思吗(新建\保存\打印\帮助)??什么是所有的帮助??不好意思 真的没明白,能再解释一下吗?谢谢

#47


这样最简单,右击选项则弹出帮助,左击是正常操作  


      private void NewToolStripMenuItem_Click(object sender, EventArgs e)     //新建
        {
            //
            MessageBox.Show("新建完成");
        }

        private void NewToolStripMenuItem_MouseDown(object sender, MouseEventArgs e)
        {
            if (Control.MouseButtons == MouseButtons.Right)
            {
                //右击帮助
                MessageBox.Show("关于“新建”的帮助");
            }
        }

#48


呵呵 代码是对的 可是我不能用啊,公司不让啊

#49


你还在加班么?

#50


是啊