关于此有很多问题(one,two,three,four,five),但是我尝试了所有这些修复程序,它们要么不起作用,要么不起作用适合我的目的。这是我的基本结构:
User Control
|-Panel
|-Picture Box (several of them, created at runtime, do not exist at design time)
因为我认为这是相关的,所以面板的停靠设置为“填充”,调整大小设置为“增大和缩小”,因此它始终覆盖整个用户控件。 PictureBox始终覆盖面板的一部分,但通常不是全部(尽管有可能)。
我特别在听
Ctrl + C
,并且我需要一种可以响应的方法,而不管哪个孩子有焦点。我想要一种可以监听任意按键的方法,以便以后进行扩展。链接页面上的答案之一是建议为这些按键创建一个全局侦听器,我不想这样做,因为如果它是后台应用程序,我不希望它消失。另一个建议以顶级形式检测它并将其过滤到我的用户控件中。问题是关闭的用户控件被构建为DLL,并且我不想强迫使用它的应用程序必须实现监听
Ctrl + C
的功能,这是它应该自己处理的事情。为什么上面的链接对我不起作用
1)我没有在UserControl上将KeyPreview属性设置为true。关于该问题的第二个答案表明,我已经重写了ProcessCmdKey,但是无论我尝试什么,都永远不会调用回调。
2)这也建议重写ProcessCmdKey。正如我所说,它从未被调用过。
3)我没有接受按钮可以设置为true。
4)
KeyDown
和PreviewKeyDown
回调都已实现,从未调用过。5)还建议使用ProcessCmdKey。
无论焦点如何,如何在用户控制级别检测关键事件?另外,如果我尝试了上述方法,那么我错过了哪些设置却无法正常工作?
最佳答案
OP:我特别在听Ctrl + C,我需要一个可以
无论哪个孩子有重点,都应做出回应。
如果您想从控件中处理诸如Ctrl + C之类的组合键,即使它没有焦点或无法选择,也可以在用户控件中添加不可见的MenuStrip
并为其添加项目并分配快捷方式对此。然后处理项目的点击事件,并做您需要的事情。
每次用户按下Ctrl + C时,都会引发click事件,即使您的控件不包含焦点。
您也可以使用以下代码进行操作:
public UserControl1()
{
InitializeComponent();
var menu = new MenuStrip();
var item = new ToolStripMenuItem();
item.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C;
item.Click += item_Click;
menu.Items.Add(item);
menu.Visible = false;
this.Controls.Add(menu);
}
void item_Click(object sender, EventArgs e)
{
MessageBox.Show("Ctrl + C");
}
注意
您不能在没有焦点的情况下处理按键事件,但是使用
MenuStrip
可以使用上述方法捕获要使用的快捷键。使其起作用的原因是,
Form
是ContainerControl
,并且ContainerControl
调用ToolStripManager.ProcessCmdKey
中的ProcessCmdKey
方法,这会导致处理ToolStripManager
的所有非上下文菜单条的快捷方式。有关更多信息,请查看
ContainerControl.ProcessCmdKey
的source code。