MFC 拦截屏蔽对话框热键

刚开始接触MFC对话框应用程序时,因为没有做处理操作,导致在对话框界面按Esc键或Enter(回车)键,导致对话框退出。在MFC中可以通过屏蔽回车和ESC来解决对话框关闭。

方法

重写PreTranslateMessage虚函数即可解决问题。

BOOL CSoftKeyboardDlg::PreTranslateMessage(MSG* pMsg)
{
	if (pMsg->message == WM_SYSKEYDOWN)//Alt+?系列热键
	{
		CString strKeyMap;
		BOOL bAlt = ::GetKeyState(VK_MENU) & 0x8000;
		if (bAlt)
		{
			if (pMsg->wParam == VK_F4)//屏蔽Alt+F4(用来关闭当前窗口;2、如所有窗口已关闭或最小化,则为关机快捷键,使用后会弹出一关机对话框)
				return true;
			else if (((pMsg->wParam >= 0x30) && (pMsg->wParam <= 0x39)) || ((pMsg->wParam >= 0x41) && (pMsg->wParam <= 0x5a)))//Alt+?热键(?在0-9,A-Z)
			{
				strKeyMap.Format(_T("Alt+%c"), pMsg->wParam);
				GetDlgItem(IDC_EDIT3)->SetWindowText(strKeyMap);
				return true;
			}
			else
				GetDlgItem(IDC_EDIT3)->SetWindowText(_T("无"));
		}
		else
			GetDlgItem(IDC_EDIT3)->SetWindowText(_T("无"));
	}
	else if (pMsg->message == WM_KEYDOWN)
	{
		BOOL bCtrl = ::GetKeyState(VK_CONTROL) & 0x8000;
		BOOL bShift = ::GetKeyState(VK_SHIFT) & 0x8000;
		BOOL bAlt = ::GetKeyState(VK_MENU) & 0x8000;
		BOOL bHotKey = bCtrl | bShift | bAlt;//判断是否有热键按下
		CString strKeyMap;
		if (pMsg->wParam == VK_RETURN)		//屏蔽回车
			return true;
		else if (pMsg->wParam == VK_ESCAPE)	//屏蔽ESC
			return true;
		else if (bHotKey)
		{
			if (((pMsg->wParam >= 0x30) && (pMsg->wParam <= 0x39)) || ((pMsg->wParam >= 0x41) && (pMsg->wParam <= 0x5a)))
			{
				if (bCtrl)
					strKeyMap += _T("Ctrl+");
				if (bShift)
					strKeyMap += _T("Shift+");
				if (bAlt)
					strKeyMap += _T("Alt+");

				strKeyMap.Format(_T("%s%c"), strKeyMap, pMsg->wParam);
				GetDlgItem(IDC_EDIT3)->SetWindowText(strKeyMap);
				return true;
			}
			else
				GetDlgItem(IDC_EDIT3)->SetWindowText(_T("无"));
		}
		else
			GetDlgItem(IDC_EDIT3)->SetWindowText(_T("无"));
	}

	return CDialogEx::PreTranslateMessage(pMsg);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值