使用 ActiveX 控件在网页上丢失 copy/paste 个快捷键

Losing copy/paste shortcut-keys on web page with ActiveX control

Short: 我 认为 我需要知道 ActiveX 控件 does/should 如何与(快捷)按键交互它在 Internet Explorer 的页面上?

:

我有一个非常奇怪的问题,正在寻求帮助。

我有一个 ASP.NET 网络应用程序。一些 .aspx 页面包括 ActiveX 控件,来自:

<object classid="..." type="application/x-oleobject" codebase="url-in-my-app" />

没什么特别的。我有 (2) ActiveX 控件的源代码 (C++/MFC) --- 内部编写,不是我的区域,作者已经离开。关于 ActiveX 控件的一切工作正常(包括与用户的交互),除了...

在运行时,只要 ActiveX 控件显示在页面上,Internet Explorer(任何版本)都会停止所有 快捷键 工作,在任何正常 HTML控制在页面上!因此,例如,用户不能使用 Ctrl+CCtrl+VCtrl+A、还有 Del 键,在 <input><textarea> 控件中; Ctrl+C 不会从页面复制任何内容(甚至静态文本也不行),它会保持当前剪贴板内容不变。所以基本上我认为他们只是被忽略了。使用右键单击上下文菜单 copy/paste 确实可以正常工作。离开页面是恢复行为的唯一方法。

更糟(?),在 Visual Studio (2010) 在设计时,如果我进入主机 .aspx 页面上的 HTML 编辑器并进入 "Design" 或"Split" 查看(但不是 "Source"-only)所有此类快捷键同样在 VS 内的任何地方停止工作,在任何 window 中,使代码编辑变得困难!必须退出VS重新进入才能解决。我想我记得不久前 VS 提示我 "This page contains an ActiveX control, would you like it to show as such while viewing/editing the page" 我说 "Yes" (现在找不到撤消的地方?);所以我想这与 IE 运行时的问题相同。

假定 这不是页面上 ActiveX 控件的正常行为?我正在寻找任何 help/advice 关于在(大型)ActiveX 控件源代码中寻找什么的东西,好吗?我不知道页面上的 ActiveX 控件如何拦截 IE 中的快捷键,即使其他一些正常的 HTML 控件具有 focus/input?如果是这种情况(我猜是这样),我在源代码中寻找什么,我该如何纠正?

我真的不知道如何开始,所以感谢任何东西。

嗯,什么都不知道,我浏览了ActiveX控件的所有源代码。我偶然发现了一个 PreTranslateMessage() 调用,并猜测这可能是根。

处理加速键所需的 ActiveX 控件(我想自从我的问题 Ctrl+Caccelerators而不是 shortcuts) 当用户与之交互时。为此,它的代码显然取自 https://support.microsoft.com/en-gb/kb/187988。我的应用程序中代码的要点是:

BOOL CMyActiveXControl::PreTranslateMessage(MSG* pMsg) 
{
  // if we're an ActiveX control, we don't get direction keys (arrows, home, end)
  // so we need to intercept them here, and handle them
  // we don't want the parent to handle them, so return TRUE
  ...
  return TRUE;
}

// Hook procedure for WH_GETMESSAGE hook type.
LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  // If this is a keystrokes message, translate it in controls' PreTranslateMessage().
  LPMSG lpMsg = (LPMSG) lParam;
  if( (nCode >= 0) &&
     PM_REMOVE == wParam &&
     (lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST) &&
     AfxGetMainWnd()->PreTranslateMessage((LPMSG)lParam) )
     {
       // Do *not* propagate this message to further hooks
     }
}

SetWindowsHookEx(WH_GETMESSAGE, GetMessageProc, AfxGetInstanceHandle(), GetCurrentThreadId());

在IE中的ActiveX控件中,AfxGetMainWnd()是IE中的网页window。因此,这段代码是 "gobbling" 加速器,不仅针对自身,而且 还针对页面上的所有其他控件

很明显,它需要进行测试来确定击键是否针对自己。我去了:

CRect rcFrame;
AfxGetMainWnd()->GetWindowRect(&rcFrame);
if (rcFrame.PtInRect(lpMsg->pt))

可能还有其他 better/more 可靠的方法,我不知道,但这允许我的 ActiveX 控件在鼠标光标位于其上的任何位置时处理加速器,同时允许它们通过 IE 父 window 当它在其他任何地方时,这似乎是有效的。

道德(对于任何关心的人):如果您需要 ActiveX 控件来处理击键消息,需要编写一些机制来确定它们是否针对您的 ActiveX 控件或在 IE 主机上。 None 我能找到的例子中提到了这一点。