OCX控件无法截获方向键
编号:QA000068
建立日期: 1998年11月3日 最后修改日期:1998年11月3日
所属类别:
wang weiran:
我在VC5下编写了一个OCX控件,其中WM_KEYDOWN消息和WM_CHAR消息由我先过滤处理。编成之后,在VC、POWERBUILDER中均正常,唯独将控件插入VB5中出现异常:表现为对键盘的四个箭头键及TAB键的KEYDOWN消息均无法截获,而其余键却表现正常,可以收到并处理,请问这是为何?
回答:
截获方向键应该重载PreTranslateMessage函数,如果不重载这个函数,VB会将这几个键的操作解释为移动输入焦点(focus)。通常的程序如下:
BOOL CSampleControl::PreTranslateMessage(LPMSG lpmsg)
{
BOOL bHandleNow = FALSE;
switch (lpmsg->message)
{
case WM_KEYDOWN:
switch (lpmsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
bHandleNow = TRUE;
break;
}
if (bHandleNow)
OnKeyDown(lpmsg->wParam, LOWORD(lpmsg
->lParam), HIWORD(lpmsg->lParam));
break;
}
return bHandleNow;
}
不过这样做有时仍无法截获方向键,这是因为Container没有调用PreTranslateMessage函数,对于这种情况可以参考微软的Knowledge Base的文章:“Q168777 RB: MFC ActiveX Control in IE Doesn't Detect Keystrokes”。
此问题由李海回答。
| |
|
|
| |
|
|