在 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);
}
我正在尝试在我的应用程序中检测是否按下了 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);
}