[ATL/WTL]_[初级]_[关于CEdit不识别WM_KEYDOWN的问题]
来源:互联网 发布:linux yum网络安装 编辑:程序博客网 时间:2024/05/17 02:56
场景
- Win32 的Edit 控件如果没有Accelerator的话默认支持Ctrl+a, Ctrl+V等全选, 粘贴操作, 不需要自己添加支持.
- 如果需要自己添加回车响应搜索实现的话,常见的方式是在 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;}
说明
- 但是有时候突然它就不响应Ctrl+V里, 很奇怪的现象, 不同的项目相同的代码有的却不响应Ctrl+V, 但却响应Ctrl+A.
- 使用Spy++来查看窗口的消息, 发现是有WM_KEYDOWN消息的.
- 因为自定义的 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.
- 解决办法就是删除这个Accelerator, 在资源文件rc里删除 Accelerator 或者删除Ctrl+V的快捷键映射:
参考
win32 select all on edit ctrl
TranslateAccelerator function
WM_CHAR message
0 0
- [ATL/WTL]_[初级]_[关于CEdit不识别WM_KEYDOWN的问题]
- [ATL/WTL]_[初级]_[关于graphics.DrawImage绘图时显示不正常的问题]
- [ATL/WTL]_[初级]_[SDI程序关闭的注意事项]
- [ATL/WTL]_[初级]_[常用的界面对象操作]
- [ATL/WTL]_[初级]_[环境搭建]
- [ATL/WTL]_[初级]_[拖放文件到窗口]
- [ATL/WTL]_[初级]_[Windows消息循环初解]
- [ATL/WTL]_[初级]_[选择目录对话框]
- [ATL/WTL]_[初级]_[Win32实现Cocoa的dispatch_async到主线程的异步消息处理]
- [ATL/WTL]_[初级]_[CBitmap复制图片-截取图片-平铺图片]
- [ATL/WTL]_[初级]_[转发消息让CStatic支持点击消息操作]
- [ATL/WTL]_[初级]_[窗口如何实现WM_MOUSELEAVE和WM_MOUSEHOVER]
- [ATL/WTL]_[初级]_[Win32窗口自定义消息处理过程]
- [ATL/WTL]_[初级]_[如何使用GetOpenFileName多选文件-根据文件名长度计算lpstrFile长度]
- [VS2010]_[初级]_[VC++ Express 使用WDK的ATL编译出现的问题解决办法]
- 关于STL/ATL/WTL之间的区别
- 关于STL/ATL/WTL之间的区别
- WTL项目的ATL支持问题
- java序列化和反序列化
- php实现post请求 接收android客户端json数据 存储数据库 并返回json
- ubuntu vim安装
- 【Boost】boost库的随机数的例子
- Spring 依赖注入
- [ATL/WTL]_[初级]_[关于CEdit不识别WM_KEYDOWN的问题]
- 【TRIO-Basic从入门到精通教程五】直线、圆弧插补的指令使用
- HDOJ_Prime Ring Problem
- Android烟花效果(SurfaceView实现)
- 6/14 筑个窝
- WPF实现MDI窗体
- ajax_思维导图简单总结
- 法线贴图
- Java设计模式-Proxy代理模式