- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
看来我遇到了一个不小的问题。
我将自己的窗口挂接到 IE 主窗口。我的窗口派生自 WTL 的 CWindowImpl 并承载 IWebBrowers2 控件,它显示一些内容。
IWebBrowser2 显示带有 <input type='text'/>
的 html我需要支持所有键的编辑框,这是编辑和操作文本所必需的(Ctrl + C、Ctrl + V、Ctrl + X 等...+ Esc、Delete、向上和向下箭头)。
我还需要禁用一些快捷方式,例如 Ctrl + P、Ctrl + S,因为它们会调用我不需要的特定于网页的对话框。
似乎是常见问题,我需要为我的 IWebBrowser2 对象调用 TranslateAccelerator。
网上有一些类似的问题- Tab key doesn't work in IWebbrowser2
解决方案 – hot key not work!!
Tab key support in an IWebBrowser2 control
这是一个非常有趣的线程,我需要的都是 – Handling Control-C in a hosted web browser control
因此,首先我需要为我的 IWebBrowser2 对象调用 TranslateAccelerator。但我必须先从键盘获取消息。
那么,让我们看看它的外观。
我的钩子(Hook)窗口没有收到任何键盘输入消息。带有“Internet Explorer_Server”类的窗口接收所有这些(实际上,它是 IWebBrowser2 中的 IE 的一个 hwnd)。
所以我需要 Hook 这个 hwnd 的窗口过程。
m_ieOldProc = (PROC)::SetWindowLongPtr ( hIEWnd, GWLP_WNDPROC, (LONG_PTR)_IEWndProc );
在 hooked wnd proc 中,我执行以下操作:
// ...
switch ( uMsg )
{
case WM_KEYUP:
case WM_KEYDOWN:
{
// ...
IOleInPlaceActiveObject* pAccelerator;
CComPtr< IWebBrowser2 > pWebBrowser = CWebWindow::GetWebBrowser( hwnd );
if( pWebBrowser )
{
hr = pWebBrowser->QueryInterface( IID_IOleInPlaceActiveObject,(void**)&pAccelerator );
if ( SUCCEEDED(hr) )
{
pAccelerator->TranslateAccelerator(&msg);
pAccelerator->Release();
}
}
// ...
}
}
// ...
是的!有些事情得到了工作! Esc、Delete、向上和向下箭头键现在可以使用。
但不是全部。快捷方式有问题。
Ctrl + X、Ctrl + V - 工作。
这里是 Spy++ 中的消息日志,用于类为“Internet Explorer_Server”的 hwnd。
在 Ctrl + C 上我没有收到 WM_COMMAND。
在 Ctrl + X 上:
我也不知道为什么。
2。 “坏”的捷径确实有效。打印对话框调用 Ctrl + P,网页保存对话框调用 Ctrl + S,等等。在这种情况下我无能为力。无论我在 hooked window proc 中返回什么,它们仍在显示。所以我需要在发送到窗口之前处理它们。
解决方案?
你可以提到在这个问题的所有解决方案中有:
直到这一刻,我在 Hook 的消息过程中只有 TranslateAccelerator。
Pretranslate 必须做类似的事情:
BOOL PreTranslateMessage(MSG* pMsg)
{
if((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) &&
(pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST))
return FALSE;
// give HTML page a chance to translate this message
return (BOOL)SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);
}
此外,在 PreTranslateMessage 中,我可以过滤“不良”快捷方式并且不将它们发送到窗口。
另一个人建议也使用 PretranslateMessage(来自上面线程的对话):
– Derive your window from CMessageFilter, install it with CMessageLoop::AddMessageFilter, implement PreTranslateMessage as shown in the example.
– I think I've done now what the sample suggests. But the problem is that my 'parent' window doesn't get the keystrokes - they all go to the IE AX control.
– That's why you need CMessageFilter. It gets hooked into the message pump, before message are dispatched to their destination windows.
好的,但是承载 IWebBrowser2 的根窗口没有收到任何键盘消息。此外,我的窗口中没有 PreTranslateMessage,只有窗口过程调用(由父 CWindowImpl 调用)。
如上所述,我可以从 CMessageFilter 派生,实现 PreTranslateMessage,但我无法使用 CMessageLoop::AddMessageFilter 订阅事件,因为我没有创建主窗口并且无权访问它的 CMessageLoop。
那么我现在应该怎么做才能使所有这些工作正常进行?我应该使用 PreTranslateMessage 吗?如何使用?
最佳答案
最近我也遇到了复制/剪切命令不起作用的问题。结果证明这不是 TranslateAccelerator 或类似软件中的键盘问题。问题是 COM 库是使用 CoInitialize/CoInitializeEx 初始化的。但是需要调用 OleInitialize 而不是剪贴板才能工作。 MSDN“WebBrowser Customization”页面上有解释:
Your application should use OleInitialize rather than CoInitialize to start COM. OleInitialize enables support for the Clipboard, drag-and-drop operations, OLE, and in-place activation. Use OleUninitialize to close the COM library when your application shuts down.
http://msdn.microsoft.com/en-us/library/aa770041(v=vs.85).aspx
如果还是不行,请看一下我在 PHP 桌面项目中对 IWebBrowser2 控件的实现(C API):
https://code.google.com/p/phpdesktop/source/browse/phpdesktop-msie/msie/
关于internet-explorer - IWebBrowser2 Ctrl+C等快捷键支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638950/
如何检测在 WPF 中按下了 Ctrl + O 等快捷键(独立于任何特定控件)? 我 try catch KeyDown但KeyEventArgs不会告诉我 Control 或 Alt 是否已关闭。
我想给 JMenuItem 添加一个热键。我学会了如何添加看起来像 CTRL+SOME_KEY 的键。但我需要的是三重热键。类似 CTRL+ALT+W 的东西。我想给 JMenuItem 添加一个热键
我被要求制作一个日文版的桌面应用程序,将来可能会是中文版。所有字符串都保存在资源文件中,其中一些包含用于显示访问/快捷键的下划线,例如“_Save”或“Save _As ...”。当按下 Alt 键时
命令 我们在前面HelloWord章节中已经提到了命令写法,这里再重温一下。 context.subscriptions.push(vscode.commands.registerComma
我目前正在 MSDN 中游泳(淹没),寻找此问题的答案: 像 OneNote 一样,我希望我的通用 Windows 应用程序能够监听快捷方式。然后运行一些东西,并显示结果。 所以我发现了这个关于 La
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我对 Qt 完全陌生。 如何在 Mac 上用代码定义 Cmd + 数字键 键序列? 对于 Windows,我有 QKeySequence(QString("Ctrl+") + QString::num
我为javascript函数制作了一个快捷键。我设置了 S 键来启动此功能,因此设置了 Z 键来清除间隔功能,但我对此感到厌倦,当按 Z 键时,间隔不会停止:( var isCtrl = false;
问题: 我有一个 WebBrowser 并公开了它的 ActiveX 方法。在我的 WebBrowser 所在的表单中,我有一个带有快捷方式的 MainMenuStrip。只有当我在我的表单上的文本框
我正在尝试实现编辑器的快捷方式,但到目前为止还没有取得任何成功。 我想覆盖一些默认的 QScintilla 快捷键。我读过这篇answer ,但我不确定这是否有助于解决我的问题。 我还阅读了 Scin
基本配置(萌新看,大佬请跳到下一节) 1、创建项目 点击Create New Project创建新的项目,点击Open打开已有的项目。 先选择左侧的项目类型,在右边选择项目的所在目录,强烈
当我想用快捷键 ctrl + / 注释或注释掉我的代码时,IntelliJ 将 // 放在第一列而不是电流。当前如何发表评论? 例子 System.out.println(set.co
我经常更改编辑器的字体大小。那么有没有人知道快捷键?到目前为止,我必须通过几次点击来使用菜单:首选项 -> 颜色和字体 -> 基本 -> 文本字体。可以使用 CTRL + MouseWheel 会很好
如何将 Xcode 4 快捷键重置为默认值? Xcode -> 性能 -> 键绑定(bind) 我发现我设置了错误,但找不到重置为原始的方法。 我该怎么办?重新安装 Xcode 4? 最佳答案 只需单
我试图从 TEdit 的 OnKeyPress 事件中检测 Ctrl+V,并且我已经请注意,当按 Ctrl+AnyKey 时,Key 参数会采用不寻常的值。 示例: procedure TForm1.
我定义了这些 requireJs 选项: require.config({ baseUrl: '/js/', paths: { jquery: '/components
最近,FoxitReader for Linux 正式推出,我很喜欢。 http://www.webupd8.org/2015/09/foxit-pdf-reader-sees-new-linux-r
如果您通过查找或 Shift + Cmd + O 在 Appcode 中打开文件,您看不到该文件在项目中的哪个文件夹中。在项目资源管理器中,左侧顶部栏上有一个按钮,如果您将鼠标悬停在它上面,它会显示文
Eclipse 中是否有快捷键可以用其 unicode 转义序列 (\uXXXX) 替换特殊字符(重音)? 最佳答案 作为替代方法,您可以使用 Java 编辑器模板(请参阅 Eclipse Prefe
在 Visual Studio 中,当您在按钮等文本中的字母前使用“&”来获取带下划线的字母快捷方式时,ALT + that letter 执行按钮等。 我想知道如何在 Java 中做到这一点。我知道
我是一名优秀的程序员,十分优秀!