在C ++中检测Keydown事件的Enter / Return

时间:2015-05-08 15:17:27

标签: c++ mfc keypress

我试图在我的应用程序中检测是否按下 Enter / Return 按钮。我的问题是 LVN_KEYDOWN 事件(表示已按下某个键)未检测到 Enter / Return 键。

我见过其他语言的类似问题,但找不到C ++的解决方案。

我阅读按键的事件是:

void ListOption::OnLvnKeydownList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR);
    // TODO: Add your control notification handler code here
    if(pLVKeyDow->wVKey == VK_RETURN)
    {
        OnItemActivateList1(pNMHDR, pResult);
        *pResult = 1;
    }
    *pResult = 0;
}

此代码适用于几乎所有键,但 Enter 键除外。

我的对话框只有一个按钮,它是&#34;默认按钮&#34;值为FALSE。如何检测按键?

更新:我的应用程序使用模式对话框..它包含一个包含CImagePages(标签)的CImageSheet。这是一个更好解释的图像(我已经放置了灰色块来隐藏一些私人数据enter image description here

当我按 Enter 时,我希望打开一个新对话框来更改选项。目前,这是通过 LVN_ITEMCTIVATE 事件完成的(当用户双击某个项目时):

1 个答案:

答案 0 :(得分:3)

您可以在拥有ListView的窗口中覆盖PreTranslateMessage。在这种情况下,它似乎是CPropertyPage

BOOL CMyPropertyPage::PreTranslateMessage(MSG* pMsg)
{
    //optional: you can handle keys only when ListView has focus
    if (GetFocus() == &List) 
    if (pMsg->message == WM_KEYDOWN)
    {
      if (pMsg->wParam == VK_RETURN)
      {
         //return 1 to eat the message, or allow for default processing
         int sel = List.GetNextItem(-1, LVNI_SELECTED);
         if (sel >= 0)
         {
            MessageBox("VK_RETURN");
            TRACE("ListView_GetNextItem %d\n", sel);
            return 1;
         }
         else
            TRACE("ListView_GetNextItem not-selected, %d\n", sel);
      }

      if (pMsg->wParam == VK_ESCAPE)
      {
         //do nothing!
      }
    }

    return CPropertyPage::PreTranslateMessage(pMsg);
}