+ -
当前位置:首页 → 问答吧 → PreTranslateMessage无法捕获小键盘消息问题

PreTranslateMessage无法捕获小键盘消息问题

时间:2011-12-19

来源:互联网

我用的是PreTranslateMessage捕获加速键来捕获指定的键盘消息的,方法如下
建加速键
IDD_MYDIALOG ACCELERATORS DISCARDABLE  
BEGIN  
  VK_RETURN, ID_MY_ENTER, VIRTKEY, NOINVERT
  VK_NUMPAD1, ID_MY_ONE, VIRTKEY, NOINVERT
END  

在CMyDialog.h里添加快捷键变量,和响就函数
HACCEL m_hAccel;
  BOOL PreTranslateMessage(MSG* pMsg);
void OnMyEnter();
void OnMyOne();
在在CMyDialog.cpp里添加响应函数定义, 加速键和响应函数关联,加载加速键
BEGIN_MESSAGE_MAP(CBoatList, CDialog)
ON_COMMAND(ID_MY_ENTER,OnMyEnter)
ON_COMMAND(ID_MY_ONE,OnMyOne)
END_MESSAGE_MAP()

BOOL CBoatList::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
m_hAccel = ::LoadAccelerators(AfxGetResourceHandle(),MAKEINTRESOURCE(IDD_MYDIALOG));
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

BOOL CDialog::PreTranslateMessage(MSG* pMsg)  
{  
if (WM_KEYFIRST <= pMsg-> message &&  
pMsg-> message <= WM_KEYLAST)  
{  
HACCEL hAccel = m_hAccel;  
if (hAccel &&  
::TranslateAccelerator(m_hWnd, hAccel, pMsg))  
return TRUE;  
}  
return CDialog::PreTranslateMessage(pMsg);  

void CMyDialog::OnMyEnter()
{
AfxMessageBox(_T("enter"));
}
void CMyDialog::OnMyOne()
{
AfxMessageBox(_T("1"));
}
可是上面这个方法,可以捕获enter,方向键,却不能捕获小键盘上的消息,有高手指点下原因吗?

作者: ltsf1984   发布时间: 2011-12-19

你有没有一个一个的试试。

作者: foxriver_gjg1989   发布时间: 2011-12-19

BOOL CDialog::PreTranslateMessage(MSG* pMsg)  
{  
if (WM_KEYFIRST <= pMsg-> message &&  
pMsg-> message <= WM_KEYLAST)  
{  
HACCEL hAccel = m_hAccel;  
if (hAccel &&  
::TranslateAccelerator(m_hWnd, hAccel, pMsg))  
return TRUE;  
}  
我觉得
这个函数不写,也能触发OnMyEnter OnMyOne

作者: tubo_true   发布时间: 2011-12-19

PreTranslateMessage(MSG* pMsg)
这个可捕获所有消息的。。。

作者: shen_wei   发布时间: 2011-12-19