IE 插件里CEdit无法响应 退格,删除键

yahle 2006-09-01 09:05:10
前面已经有人问过,通过hook拦截系统消息的方法获得退格,删除键的消息
http://community.csdn.net/Expert/topic/4981/4981009.xml?temp=.7123987

我试了一下,能拦截到消息,但是拦截到消息后,该怎么让CEdit进行处理就不懂了。
我现在的做法是将消息转发给CEdit控件,但是发现还是删除不了文字。

if (lpMsg->message == WM_KEYUP && lpMsg->wParam == VK_BACK)
{
if (pMenuBar != NULL)
{
if (pMenuBar->m_edit.IsDialogMessage(lpMsg) == TRUE)
{
//AfxMessageBox("back"); // 这里有响应
//pMenuBar->m_edit.SendMessage(lpMsg->message, lpMsg->wParam, lpMsg->lParam);
SendMessage(pMenuBar->m_edit.m_hWnd, lpMsg->message, lpMsg->wParam, lpMsg->lParam);
}
}
}


还有一个问题,就是我应该在什么时候释放这个hook的钩子?
...全文
394 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yahle 2006-09-01
  • 打赏
  • 举报
回复
能说得详细些吗,或者那里有你介绍的方法的文章
superarhow 2006-09-01
  • 打赏
  • 举报
回复
几个特殊键(方向、回车、退格)不能这样处理。Browser对象支持IOleInPlaceActiveObject接口,使用它的TranslateAccelerator方法来处理。
yahle 2006-09-01
  • 打赏
  • 举报
回复
superarhow(苏泊尔耗)

你给的代码是不是去触发 浏览器的 退格键?

我现在需要的是让浏览器把退格键被触发的消息传导到CEdit控件。
lookvc 2006-09-01
  • 打赏
  • 举报
回复
其中的hEditHandle 为CEdit控件对象的HWND
lookvc 2006-09-01
  • 打赏
  • 举报
回复
//钩子函数
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{


if (nCode < 0) // do not process message
return CallNextHookEx(hhook, nCode,
wParam, lParam);

PMSG pMsg = (PMSG) lParam;
if(pMsg->hwnd == hEditHandle)
{
if(pMsg->message == WM_KEYDOWN )
{
if(pMsg->wParam == VK_BACK
|| (pMsg->wParam > VK_NEXT && pMsg->wParam < VK_DOWN))
{
msg = *pMsg;
LRESULT lr = ::SendMessage(msg.hwnd,msg.message,msg.wParam,msg.lParam);
}
}
}
return CallNextHookEx(hhook, nCode,
wParam, lParam);
}
lookvc 2006-09-01
  • 打赏
  • 举报
回复
CEdit重载OnKeyDown函数中添加

if(nChar == VK_BACK)
{
int nStart,nEnd;
GetSel(nStart,nEnd);
if(nStart != nEnd)
{
CString sContext;
GetWindowText(sContext);
ReplaceSel("",TRUE);
}
else
{
SetSel(nStart-1,nEnd);
ReplaceSel("",TRUE);
}
}
superarhow 2006-09-01
  • 打赏
  • 举报
回复
纠正一下,CComPtr<IDispatch> pApp(m_Browser.get_Application());
这种写法图简便,其实是不对的,实际应用中应当在最后对get_Application()的接口进行Release
superarhow 2006-09-01
  • 打赏
  • 举报
回复
假设你是用的导入的控件,名字是m_Browser(用其它的也一样,总能拿到Application的)
以下代码模拟向browser送退格键:
m_Browser.SetFocus(); /* 这一句可以不需要,我是在BtnClick事件里写的,焦点不在Browser上,所以强行设置了一下 */
CComPtr<IDispatch> pApp(m_Browser.get_Application());
CComQIPtr<IOleInPlaceActiveObject> pObj(pApp);
MSG msg;
msg.hwnd = m_hWnd;
msg.message = WM_KEYDOWN;
msg.wParam = VK_BACK;
msg.lParam = 0;
msg.time = GetTickCount();
msg.pt.x = msg.pt.y = 0;
pObj->TranslateAccelerator(&msg);

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧