去掉在模态对话框处理鼠标跟键盘消息时,出现系统提示声音

本文介绍了一种在基于模态CDialog窗口的应用中屏蔽键盘消息或鼠标消息触发的声音的方法。通过重写PreTranslateMessage函数并针对WM_CHAR消息进行特殊处理,可以有效地避免系统发出提示音。

基于模态CDialog 窗口时,当处理键盘消息或是鼠标消息时,有时会提示“当当”的声音,这个可以通过设置系统来关掉声音;通过去掉系统的默认初始消息来屏蔽声音:

BOOL CPiFuMBDlg::PreTranslateMessage(MSG* pMsg)
{

if(pMsg->message==WM_CHAR)
 {
  return TRUE;
 }

 return CBaseDialog::PreTranslateMessage(pMsg);
}

 

MFC 中,非模态对话框消息处理机制与模态对话框有所不同,尤其是在处理鼠标双击事件。由于非模态对话框消息处理依赖于主应用程序的消息循环,因此必须确保鼠标双击消息能够被正确路由到对话框类中进行处理。 ### 处理鼠标双击消息的基本方法 在 MFC 中,鼠标双击事件通常对应 `WM_LBUTTONDBLCLK` 消息。在非模态对话框中,可以通过在对话框类中重写 `OnLButtonDblClk` 函数来捕获并处理消息。 ```cpp void CTestDlg::OnLButtonDblClk(UINT nFlags, CPoint point) { // 处理鼠标双击事件 AfxMessageBox(_T("鼠标双击了对话框区域")); CDialog::OnLButtonDblClk(nFlags, point); } ``` 需要注意的是,如果对话框中包含子控件(如按钮、编辑框等),这些控件可能会优先捕获鼠标事件,导致对话框类无法接收到 `WM_LBUTTONDBLCLK` 消息。可以通过在资源编辑器中设置控件的 `Notify` 属性为 `True`,以确保双击事件可以被正确传递[^1]。 ### 自定义消息处理 如果希望在消息进入窗口过程之前进行拦截,可以重写 `PreTranslateMessage` 函数,并在此函数中判断 `WM_LBUTTONDBLCLK` 消息。 ```cpp BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_LBUTTONDBLCLK) { AfxMessageBox(_T("PreTranslateMessage 捕获到鼠标双击")); return TRUE; // 表示消息已被处理 } return CDialog::PreTranslateMessage(pMsg); } ``` 然而,由于非模态对话框依赖主应用程序的消息循环,该函数可能不会被调用,除非主消息循环显式地将消息传递给对话框的 `PreTranslateMessage` 方法[^1]。 ### 确保消息正确路由 非模态对话框必须处于激活状态,才能接收到鼠标事件。可以通过调用 `SetActiveWindow()` 方法确保对话框获得焦点: ```cpp pDlg->SetActiveWindow(); ``` 此外,对话框的窗口样式也会影响消息的接收。如果使用 `WS_CHILD` 样式,某些鼠标事件可能不会被正确接收。可以尝试将样式设置为 `WS_POPUP` 或 `WS_OVERLAPPED`,以确保消息能够正确传递[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值