UserControl中未触发KeyDown事件

时间:2012-08-28 09:40:09

标签: c# winforms keyboard focus keyevent

我的UserControlTreeViewTabControl。此用户控件以正常形式托管。

如果用户从树视图中选择了某些内容,则会将自定义图片框添加到tabcontrol的标签页中。现在我想处理这个图片框上的键,但是我在custompicturebox中创建的事件没有被调用。我想要的是处理箭头键,但焦点停留在树视图上,因此箭头键只发生在树视图中。

我提供了代码,以便在用户点击时将焦点放在图片框上,但它不会帮助从树视图中移除焦点。以下是我在custompicturebox控件中的代码的一部分:

更新 似乎只有像ARROW键这样的特殊键不起作用,我的猜测是因为树视图正在注册箭头键。如果我将图片框中的KeyDown事件更改为使用字符键,则可以使用!

private void IcPackageViewBox_KeyDown(object sender, KeyEventArgs e)
{
    if(e.KeyCode == Keys.Right)
    {
        OnPinClicked(_pinMap[_pinRectIndex].Pin);

        if (_pinRectIndex < _pinMap.Count)
            _pinRectIndex++;
        else
            _pinRectIndex = 0;
    }
}
    //Mouse Down Event
private void PackageViewBox_MouseDown(object sender, MouseEventArgs e)
{
    Focus();
    BringToFront(); //bring to front works! maybe it means focus should work also?
 }

在托管此UserControl的表单中,我将KeyPreview设置为True,但我还必须处理此表单上的其他事件。也许这就是为什么我无法在customcontrol中获得keypress?

    private void MainForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Modifiers == Keys.Control)
        {
            projectBrowser.ControlKeyIsDown = true;
            e.Handled = true;
        } 
     }

    private void MainForm_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.LControlKey || e.KeyCode == Keys.RControlKey || e.KeyCode == Keys.ControlKey || e.KeyCode == Keys.Control)
        {
            projectBrowser.ControlKeyIsDown = false;
            e.Handled = true;
        }
    }

这是程序的样子: enter image description here

1 个答案:

答案 0 :(得分:0)

处理此问题的一种方法是覆盖Form的ProcessCmdKey方法。在将它们分派到目标控件(具有焦点的控件)之前,您将获得WM_KEYDOWN消息。在那里,您可以执行自己的逻辑来处理击键,并允许或禁止进一步处理消息。