c# - Webbrowser 控件在放置在 Outlook 加载项中时不接收 Tab/Delete/Back 键

标签 c# webbrowser-control outlook-addin

我正在构建一个公开自定义任务 Pane 的 Outlook 加载项。从此 Pane 开始执行某些用户操作,

  1. 我创建了一个新的 UserControl(其中有一个 WebBrowser 控件)
  2. 获取 Outlook 消息窗口(使用 Win API FindWindow("rctrl_renwnd32"...) )
  3. 将消息窗口调整为 0 宽度
  4. 将我的 UserControl 的父级设置为主 Outlook 资源管理器窗口(使用 Win API User32.SetParent)
  5. 设置我的 UserControl 的大小以占据消息窗口的位置

一切都很好,除了 Outlook 将 Delete/Back/Tab 键(我确信还有更多)从传递到控件中剔除这一事实。

在此 UserControl 中,我启动了一个要求用户执行登录的内部站点。 WebBrowser 接受常规输入,但在按下 Tab/Delete/Back 键时不执行任何操作!

我已经无计可施了!我已经在网上搜索了几个星期,但似乎不知道发生了什么。

有人知道这里发生了什么以及如何解决它吗?我已经实现了一个低级键盘钩子(Hook)并且能够捕获所需的键。我试过使用 User32.PostMessage 但还是不行。

谢谢, 戒日

p.s.:我有 Java 背景,所以在 .NET 和 P/Invoke 方面我是新手。

最佳答案

WebBrowser 控件用 DLGC_WANTARROWS | 响应 WM_GETDLGCODE 消息DLGC_WANTCHARS。这就是为什么它不会处理某些键,例如 Tab、Back 和 Delete。它告诉 parent 不要处理这些 key 。

您可以编写一个 Windows Hook ,然后调用 Web 浏览器控件的 IOleInPlaceActiveObject::TranslateAccelerator 实现。

查看 Microsoft Internet 开发人员 Scott Roberts 于 1999 年 4 月撰写的“WebBrowser Keystroke Problems”以了解更多详细信息。

关于c# - Webbrowser 控件在放置在 Outlook 加载项中时不接收 Tab/Delete/Back 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4449963/

相关文章:

c# - 使用 Java 在 C# 中从嵌套类访问父类成员的差异

C# 同时使用 2 个 sqldatareader?

c# - 限制 WebBrowser 消耗过多内存

C# WebBrowser CSS 悬停样式不起作用(尽管配置了浏览器仿真)

c# - 在 Outlook 上下文菜单操作中读取 "active"邮件消息?

javascript - 如何在 Outlook 插件集成中获取用户的实际电子邮件 ID

c# - 泛型内存管理

vba - 用户窗体中的 Web 浏览器控件 : how to wait for page to initialize

c# - 如何获取 session 响应响应的 session 请求?

c# - 循环遍历字符串数组并转换为整数