VC-如何拦截对话框ESC键的处理?

VC-如何拦截对话框ESC键的处理?

归属感 发布于 2017-08-25 字数 121 浏览 1345 回复 3

用VC编写的基于对话框的应用程序,当用户按下ESC按键的时候,系统默认的处理是关闭对话框,如何编程实现截获ESC按键消息?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泛泛之交 2017-09-15 3 楼

可以再 onKeyboard 方法中,吧 Esc 键拦截下,返回 TRUE 就可以了

归属感 2017-09-13 2 楼

有几种方法:

把OnCancel()(ON_COMMAND(IDCANCEL,OnCancel))重载掉,去掉对基类CDialog::OnCancel的调用。
mfc提供了一个PreTranslateMessage()方法,就可以直接屏蔽掉某些消息。
WTL中处理IDCANCEL消息。

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message ==WM_KEYDOWN)
{
int nVirtKey = (int) wParam;
if (nVirtKey==VK_RETURN)
{
//如果是回车在这里做你要做的事情,或者什么也不作
return TRUE;
}
if (nVirtKey==VK_ESCAPE)
{
//如果是ESC在这里做你要做的事情,或者什么也不作
return TRUE;
}

}
return CDialog::PreTranslateMessage(pMsg);
}

瑾兮 2017-08-26 1 楼

ESC键对应 VK_ESCAPE,在对话框中添加消息映射PreTranslateMessage。

BOOL CDialogFullSrceen::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class

if (pMsg->message == WM_KEYDOWN)
{
if( pMsg->wParam == VK_ESCAPE )
{
bFullSrceen=FALSE;
OnCancel();
return TRUE;
}
}

if(!m_bIsCtrl||!bFullSrceen) return FALSE;
if(pMsg->message==WM_KEYDOWN)
{
::SEU_SendSocketData(screenSock, (BYTE *)&pMsg->wParam,
sizeof(UINT),SEU_KEY_DOWN);
}
if(pMsg->message==WM_KEYUP)
{
::SEU_SendSocketData(screenSock, (BYTE *)&pMsg->wParam,sizeof(UINT),SEU_KEY_UP);
}
if(pMsg->message==WM_SYSKEYDOWN)
{
::SEU_SendSocketData(screenSock, (BYTE *)&pMsg->wParam,
sizeof(UINT),SEU_SYSKEY_DOWN);
}
if(pMsg->message==WM_SYSKEYUP)
{
::SEU_SendSocketData(screenSock, (BYTE *)&pMsg->wParam,
sizeof(UINT),SEU_SYSKEY_UP);
}

if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_SPACE)
return TRUE;

return CDialog::PreTranslateMessage(pMsg);
}