关于此有很多问题(onetwothreefourfive),但是我尝试了所有这些修复程序,它们要么不起作用,要么不起作用适合我的目的。这是我的基本结构:

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)KeyDownPreviewKeyDown回调都已实现,从未调用过。

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可以使用上述方法捕获要使用的快捷键。

使其起作用的原因是,FormContainerControl,并且ContainerControl调用ToolStripManager.ProcessCmdKey中的ProcessCmdKey方法,这会导致处理ToolStripManager的所有非上下文菜单条的快捷方式。
有关更多信息,请查看ContainerControl.ProcessCmdKeysource code

07-28 02:05