2020-10-15

MFC PreTranslateMessage快捷键响应两次的问题

MFC对话框,用PreTranslateMessage实现快捷键功能时,遇到快捷键响应函数调用两次的问题。虽然问题很简单,但如果不清楚原因,还是比较棘手,所以在此记录一下。简单示例如下:

BOOL CDlgXXX::PreTranslateMessage(MSG* pMsg)
{
	switch (pMsg->wParam)
	{
		case 'D':
			OnDelRegion();
			return TRUE;
		default:
			break;
	}
	return CDialogEx::PreTranslateMessage(pMsg);
}

如上所示,以前函数意图非常简单,就是响应键盘“D”按键,执行OnDelRegion()函数。但在实际操作中发现OnDelRegion()函数会执行两次。经断点,无法确定执行堆栈。经查找资料才发现问题,原来该对话框的所有消息都经PreTranslateMessage路由处理,而按键盘按键有两个事件:按下(keydown)和松开(keyup)。所以上述代码在会在按下和松开都会进入OnDelRegion()函数,导致函数执行两次。

解决方案,屏蔽松开事件,只在按下执行。

BOOL CDlgXXX::PreTranslateMessage(MSG* pMsg)
{
	if(pMsg->message == WM_KEYDOWN)
	{
		switch (pMsg->wParam)
		{
			case 'D':
				OnDelRegion();
				return TRUE;
			default:
				break;
		}
	}
	return CDialogEx::PreTranslateMessage(pMsg);
}

对于PreTranslateMessage这个函数,还是有些使用细节需要注意的,比如return True和CDialogEx::PreTranslateMessage(pMsg)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值