LRESULT RetVal = CallNextHookEx( g_hhook, nCode, wParam, lParam ); return RetVal; } 如果不用钩子,而是用昨天找到的资料所显示,则需要在3个地方加代码 1:在CActivexCtl::OnCreate()中加代码OnActivateInPlace (TRUE, NULL);: int CFtpSeviceCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; OnActivateInPlace (TRUE, NULL); // == UI-Activate the control return 0; } 注:经测试加了这一句以后所有的Edit都可以响应BackSpace按键的消息了 重载PreTranslateMessage和OnMouseActivate两个虚拟函数,代码如下: int CFtpSeviceCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message) { if (!m_bUIActive) OnActivateInPlace (TRUE, NULL); // == UI-Activate the control
return COleControl::OnMouseActivate(pDesktopWnd, nHitTest, message); } BOOL CFtpSeviceCtrl::PreTranslateMessage(MSG* pMsg) { switch (pMsg->message) { case WM_KEYDOWN: case WM_KEYUP: switch (pMsg->wParam) { case VK_UP: case VK_DOWN: case VK_LEFT: case VK_RIGHT: case VK_HOME: case VK_END: case VK_BACK: SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam); // Windowless controls won't be able to call SendMessage. // Instead, just respond to the message here. return TRUE; } break; }
你参考一下,屏蔽<- 一个道理没时间整理了,见凉如果仅仅是用键盘钩子,则在输入VK_BACK键的情况下向焦点窗口(EDIT)
发送WM_KEYUP事件并且返回1,则只有Edit响应而IE不响应,返回0,二者都响应,页面退回上一页面!发WM_KEYDOWN无论返回1与否,只有IE响应退回前一页面。由此得出结论:二者均响应WM_KEYUP事件,第一种情况将此消息过滤掉了,IE接受不到,其他三种IE均接受到了,所以退回上一页面。正确代码如下:
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
switch(wParam)
{
case VK_BACK:
::PostMessage(GetFocus(),WM_KEYUP,wParam,lParam);
return 1;
break;
}
LRESULT RetVal = CallNextHookEx( g_hhook, nCode, wParam, lParam );
return RetVal;
} 如果不用钩子,而是用昨天找到的资料所显示,则需要在3个地方加代码
1:在CActivexCtl::OnCreate()中加代码OnActivateInPlace (TRUE, NULL);:
int CFtpSeviceCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
OnActivateInPlace (TRUE, NULL); // == UI-Activate the control
return 0;
}
注:经测试加了这一句以后所有的Edit都可以响应BackSpace按键的消息了
重载PreTranslateMessage和OnMouseActivate两个虚拟函数,代码如下:
int CFtpSeviceCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
if (!m_bUIActive)
OnActivateInPlace (TRUE, NULL); // == UI-Activate the control
return COleControl::OnMouseActivate(pDesktopWnd, nHitTest, message);
}
BOOL CFtpSeviceCtrl::PreTranslateMessage(MSG* pMsg)
{
switch (pMsg->message)
{
case WM_KEYDOWN:
case WM_KEYUP:
switch (pMsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
case VK_HOME:
case VK_END:
case VK_BACK:
SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam);
// Windowless controls won't be able to call SendMessage.
// Instead, just respond to the message here.
return TRUE;
}
break;
}
return COleControl::PreTranslateMessage(pMsg);
} 注意:1:在case VK_END: 后面千万不要加case VK_BACK: 不然BackSpace按键消息会被过滤掉。
2:将SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam);这一句替换成
::SendMessage (GetFocus()->GetSafeHwnd(), pMsg->message, pMsg->wParam, pMsg->lParam);或
m_pFtpDlg->SendMessage(WM_TRANSMESSAGW, pMsg->message, pMsg->wParam);
其中后面一种需要在m_pFtpDlg中再将消息传递给具有焦点的控件,我采用的后者。
我怎么没找到他的定义文件在哪里呀
不处理返回FALSE
MESSAGE_HANDLER(WM_GETDLGCODE, OnGetDlgCode)
在处理中只要改变返回值就可以了:
LRESULT OnGetDlgCode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler.
return DLGC_WANTARROWS;//截获上下左右键,很简单吧!没问题的!
}
总结:
1.如控件窗口为继承COleControl的窗口,则用wangweixing2000(星)的解答即可;
2.如控件窗口用其它窗口作为显示窗口,比如我的程序里用CGridCtrl作为显示窗口,则需要用Ariesman(超然)的解答。再次感谢各位!
我怎么没找到他的定义文件在哪里呀这个怎么回事?