使用 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+C、Ctrl+V、Ctrl+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+C 等 accelerators而不是 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 我能找到的例子中提到了这一点。
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+C、Ctrl+V、Ctrl+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+C 等 accelerators而不是 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 我能找到的例子中提到了这一点。