删除键不会触发KeyUp& KeyDown事件

时间:2014-01-29 08:18:56

标签: c++ c++builder

我目前正在处理一个多表单应用程序并且在注册del键按下时遇到问题,需要del键的应用程序是一个带有框架的表单,其上绘有可以选择的对象,按下del键通过deleteObjects方法删除所选对象。我目前使用的代码如下

void __fastcall TF_Image::KeyUpKbd( WORD &Key )
{
     if(Key == VK_DELETE || Key == VK_DKEY)
     {
          deleteSelectedObjects();
     }
}

(注意:函数调用中还有其他参数,但不使用它们)

TF_Image继承自TFrame

我已经尝试映射除del键之外的其他键,即D键,并且发现该方法被调用没有问题。我发现当按下(物理上)del键时,与KeyUp& KeyDown未被调用。

编辑:所以我试图将DeleteSelectedOb()方法添加到我的WndProc方法中,但运气不佳。

void __fastcall TF_ImgBrowserOA::WndProc(TMessage &Message)
{
    if (Message.Msg == WM_KEYDOWN)
    {
        if (Message.WParam == VK_DELETE)
        {
            F_Image->DeleteSelectedOb();
        }
    } 
    //code that manages window resize
    TForm::WndProc(Message);
}

WndProc方法似乎响应击键

2 个答案:

答案 0 :(得分:1)

所以在清理了一些其他模块中的代码并删除了不必要的菜单之后,我决定回过头来看看这一部分,在我发现类似的代码实现了类似的功能后,我看不出它们之间的差别很大所以我重新编译并尝试从KeyDown事件中运行我的Delete函数,由于某种原因它只是起作用,我怀疑它归结为另一个在Application中保持焦点的元素的问题。作为一种预防措施,我还将一个SetFocus()称为我需要此代码操作的帧。对我来说,这仍然是一个谜,为什么这不起作用。

答案 1 :(得分:0)

以下是我的TRichEdit控件的一个片段(Script_Edit)。

TWndMethod *PrevWndProc = Script_Edit->WindowProc;
Script_Edit->WindowProc = MyWndProc;

void __fastcall My_Form::MyWndProc(TMessage &Message) {

  switch (Message.Msg) {

    case WM_KEYDOWN: {
      // Check for DELETE and BACKSPACE keys
      if( Message.WParam == VK_BACK  ||
          Message.WParam == VK_DELETE
        ) {
             // Do whatever you need
          }
      break;

    default:
      // call default handler if not processed
      PrevWndProc(Message);

  }
}

使用VCL,你无法更接近消息核心......