[ATL/WTL]_[初级]_[关于CEdit不识别WM_KEYDOWN的问题]

场景

  1. Win32 的Edit 控件如果没有Accelerator的话默认支持Ctrl+a, Ctrl+V等全选, 粘贴操作, 不需要自己添加支持.
  2. 如果需要自己添加回车响应搜索实现的话,常见的方式是在 PreTranslateMessage 里添加对CEdit的监听和操作;
BOOL PreTranslateMessage(MSG* pMsg)
{
    if(GetFocus() != search_edit_)
    {
        return FALSE;
    }

    if(pMsg->wParam == VK_RETURN)
    {
        if(pMsg->message == WM_KEYDOWN)
        {
            BOOL bHandled = FALSE;
            OnSearch(0,0,NULL,bHandled);
            return bHandled;
        }

    }else if(pMsg->message == WM_KEYDOWN && (GetKeyState( VK_CONTROL) & 0xFF00 ) == 0xFF00) 
    {
        // 全选
        if( pMsg->wParam == 'A' || pMsg->wParam == 'a')
        {
            search_edit_.SetSel(0, -1);
            return TRUE;
        }

        // 拷贝
        if( pMsg->wParam == 'C' || pMsg->wParam == 'c')
        {
            search_edit_.Copy();
            return TRUE;
        }

        // 剪切
        if( pMsg->wParam == 'X' || pMsg->wParam == 'x')
        {
            search_edit_.Cut();
            return TRUE;
        }

        // 粘贴
        if( pMsg->wParam == 'V' || pMsg->wParam == 'v')
        {
            search_edit_.Paste();
            std::cout << "paste" << std::endl;
            return TRUE;
        }

        // 粘贴
        if( pMsg->wParam == 'Z' || pMsg->wParam == 'z')
        {
            search_edit_.Undo();
            return TRUE;
        }
    }
    return FALSE;
}

说明

  1. 但是有时候突然它就不响应Ctrl+V里, 很奇怪的现象, 不同的项目相同的代码有的却不响应Ctrl+V, 但却响应Ctrl+A.
  2. 使用Spy++来查看窗口的消息, 发现是有WM_KEYDOWN消息的.

图1

  1. 因为自定义的 CMessageFilter 子窗口类, 并不是 直接在 CMainFrame里添加过滤, 所以可能是CMainFrame里的 PreTranslateMessage 过滤了这层消息, 在以下代码调用之前是有WM_KEYDOWN消息的, 调用完之后这个消息丢失.
if(CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg))
        return TRUE;

TranslateAccelerator 的说明很显然了, 是全局快捷键过滤了:

Processes accelerator keys for menu commands. The function translates a WM_KEYDOWN or WM_SYSKEYDOWN message to a WM_COMMAND or WM_SYSCOMMAND message (if there is an entry for the key in the specified accelerator table) and then sends the WM_COMMAND or WM_SYSCOMMAND message directly to the specified window procedure. TranslateAccelerator does not return until the window procedure has processed the message.
  1. 解决办法就是删除这个Accelerator, 在资源文件rc里删除 Accelerator 或者删除Ctrl+V的快捷键映射:
    图2

参考

win32 select all on edit ctrl
TranslateAccelerator function
WM_CHAR message

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter(阿斯拉达)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值