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

Detecting Enter/Return on Keydown event in C++

我正在尝试在我的应用程序中检测是否按下了 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 键除外。

我的对话框只有一个按钮,它的 "Default Button" 值为 FALSE。如何检测按键?

更新: 我的应用程序使用模态对话框。它包含一个包含 CImagePages(选项卡)的 CImageSheet。这里有一张图片可以更好地解释(我放置了灰色块来隐藏一些私人数据)。

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

您可以在拥有 ListView 的 window 中覆盖 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);
}