关于RichEdit(如何截获Ctrl+Z快捷键删除掉的内容,以及鼠标拖拽的内容)
在使用RichEdit控件的时候,默认已经打开了关于编辑的几个快捷键,以及鼠标的拖拽功能。
请问:
1, 在我按下Ctrl+Z之后,并在RichEdit控件还没有响应撤销事件之前,要怎么做才能截取这段事件内发生的事件?
要求实现:在作出Ctrl+Z动作后,读取将撤销的内容,由我决定是否执行Ctrl+Z的撤销操作。
注:OnChar事件可以响应Ctrl+Z动作,但是却是在执行完撤销事件之后才响应的。
2, 要求实现:在作出拖拽动作后,读取拖拽选中的内容,由我决定拖拽操作是否生效。
[解决办法]
键盘钩子
HHOOK hhkKeyboard;
LRESULT KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
//MessageBeep(-1);
CString str;
str.Format("%c",wParam);
AfxMessageBox(str);
returnCallNextHookEx(hhkKeyboard,nCode,wParam,lParam);
}
if(!(hhkKeyboard=SetWindowsHookEx(WH_KEYBOARD,
(HOOKPROC)KeyboardProc,AfxGetInstanceHandle(),GetCurrentThreadId())))
MessageBox("下钩子失败!");
[解决办法]
1、 处理ID_EDIT_UNDO WM_COMMAND或EN_CANUNDO消息
2、 实现IRichEditOleCallback回调接口, 用EM_SETOLECALLBACK消息将实现的回调接口绑定到Rich窗口控件
3、 实现IRichEditOleCallback.GetDragDropEffect()方法
大致代码如下
HRESULT __stdcall xxxxx::GetDragDropEffect(BOOL fDrag, DWORD grfKeyState,LPDWORD pdwEffect)
{
*pdwEffect = FALSE; // FALSE 为取消拖拽, TRUE 或不设置该项为拖拽,可参考MSDN
return S_OK;
}
[解决办法]
LRESULT KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam){ //MessageBeep(-1); CString str; str.Format("%X",wParam); AfxMessageBox(str); if(0x5A==wParam) if(GetAsyncKeyState(VK_CONTROL)<0) AfxMessageBox("Ctrl Z"); return CallNextHookEx(hhkKeyboard,nCode,wParam,lParam); }