调用 Web 浏览器上下文菜单

2023-12-14

我正在开发一个项目,一个 Web Bot,它使用 WebBrowser 控件。

我的目标是以编程方式在加载的 Web 浏览器中的所需元素上打开 Web 浏览器上下文菜单,然后从上下文菜单中选择一个选项。

Example:

在 WebBrowser 控件中导航到 Google。 打开上下文菜单。选择“显示图片”

到目前为止,这是我设法找到的最接近的代码Here :

foreach (MenuItem vMenuItem in WebBrowser.ContextMenu.MenuItems)
{
    if (vMenuItem.Text.Contains("onwert") && vMenuItem.Text.Contains("PDF"))
    {
        vMenuItem.PerformClick();
    }
}

到目前为止,此代码在第一行返回错误,这里有解决方案吗?




工作替代方案:

到目前为止,我已经通过模拟点击成功实现了这一点,问题是当窗口隐藏时会出现明显的错误。另外,我不希望光标在屏幕上跳跃。如果有一种方法可以模拟隐藏窗口上的点击,那么它可能是这里的一个解决方案。 这是我当前模拟点击的代码:(虽然我不希望使用模拟点击,但此代码有效)

        Point controlLoc = this.PointToScreen(webbrowser1.Location);
        controlLoc.X = controlLoc.X + webbrowser1.Document.GetElementById("sbvdcapimg").OffsetRectangle.Left+65;
        controlLoc.Y = controlLoc.Y + webbrowser1.Document.GetElementById("sbvdcapimg").OffsetRectangle.Top+50;
        Cursor.Position = controlLoc;
        MouseSimulator.ClickRightMouseButton();
        controlLoc.X = controlLoc.X + (webbrowser1.Document.GetElementById("sbvdcapimg").OffsetRectangle.Left + 95);
        controlLoc.Y = controlLoc.Y + (webbrowser1.Document.GetElementById("sbvdcapimg").OffsetRectangle.Top + 45);
        Cursor.Position = controlLoc;
        MouseSimulator.ClickLeftMouseButton();

public class MouseSimulator
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

    [StructLayout(LayoutKind.Sequential)]
    struct INPUT
    {
        public SendInputEventType type;
        public MouseKeybdhardwareInputUnion mkhi;
    }
    [StructLayout(LayoutKind.Explicit)]
    struct MouseKeybdhardwareInputUnion
    {
        [FieldOffset(0)]
        public MouseInputData mi;

        [FieldOffset(0)]
        public KEYBDINPUT ki;

        [FieldOffset(0)]
        public HARDWAREINPUT hi;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct KEYBDINPUT
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct HARDWAREINPUT
    {
        public int uMsg;
        public short wParamL;
        public short wParamH;
    }
    struct MouseInputData
    {
        public int dx;
        public int dy;
        public uint mouseData;
        public MouseEventFlags dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    [Flags]
    enum MouseEventFlags : uint
    {
        MOUSEEVENTF_MOVE = 0x0001,
        MOUSEEVENTF_LEFTDOWN = 0x0002,
        MOUSEEVENTF_LEFTUP = 0x0004,
        MOUSEEVENTF_RIGHTDOWN = 0x0008,
        MOUSEEVENTF_RIGHTUP = 0x0010,
        MOUSEEVENTF_MIDDLEDOWN = 0x0020,
        MOUSEEVENTF_MIDDLEUP = 0x0040,
        MOUSEEVENTF_XDOWN = 0x0080,
        MOUSEEVENTF_XUP = 0x0100,
        MOUSEEVENTF_WHEEL = 0x0800,
        MOUSEEVENTF_VIRTUALDESK = 0x4000,
        MOUSEEVENTF_ABSOLUTE = 0x8000
    }
    enum SendInputEventType : int
    {
        InputMouse,
        InputKeyboard,
        InputHardware
    }

    public static void ClickRightMouseButton()
    {
        INPUT mouseDownInput = new INPUT();
        mouseDownInput.type = SendInputEventType.InputMouse;
        mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_RIGHTDOWN;
        SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT()));

        INPUT mouseUpInput = new INPUT();
        mouseUpInput.type = SendInputEventType.InputMouse;
        mouseUpInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_RIGHTUP;
        SendInput(1, ref mouseUpInput, Marshal.SizeOf(new INPUT()));
    }

    public static void ClickLeftMouseButton()
    {

        INPUT mouseDownInput = new INPUT();
        mouseDownInput.type = SendInputEventType.InputMouse;
        mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
        SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT()));

        INPUT mouseUpInput = new INPUT();
        mouseUpInput.type = SendInputEventType.InputMouse;
        mouseUpInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP;
        SendInput(1, ref mouseUpInput, Marshal.SizeOf(new INPUT()));
    }

是否有办法通过调用 WebBrowsers ContextMenu 来执行此过程...?!

Bump.


这取决于您的具体要求。如果你想操作特定的 HTML 元素,你可以通过 DOM 来访问它。 IMO,你可以做 WebBrowser 能做的一切。

如果您想使用上下文菜单(以避免编写额外的代码或假装用户操作),您可以在所需位置发送鼠标单击,然后暂时阻止上下文菜单弹出。这是我在Delphi中的示例代码,供您参考。

function TTrident.ShowContextMenu(const dwID: DWORD; const ppt: PPOINT; const pcmdtReserved: IUnknown;
  const pdispReserved: IDispatch): HRESULT;
begin
  if FDontShowContextMenuThisTime then
  begin
    FDontShowContextMenuThisTime := False;
    Exit(S_OK);
  end
  else
    Exit(S_FALSE);
end;

ShowContextMenu是接口的一种方法IDocHostUIHandler。换句话说,您必须通过至少实现来扩展 WebBrowser 控件IDocHostUIHandler. 另请参阅 MSDN。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用 Web 浏览器上下文菜单 的相关文章

随机推荐

  • Django 和 docker:将信息输出到控制台

    我正在使用 Django 它在 Docker 容器中运行 在我看来 发生了一些我无法理解的事情 有一些for语句和条件语句 我想看看到底哪里出了问题 对我来说 最简单的方法是可以将一些变量输出到控制台 这在 Django 中可能吗 就像是
  • 如何在 Salesforce 中以编程方式作废 DocuSign 信封?

    我正在使用 DocuSign For Salesforce 应用程序 作为工作流程的一部分 我们在满足某些条件时创建信封 但如果不再满足条件 我需要能够通过 Apex 触发器使信封无效 DocuSign 应用程序的文档详细介绍了如何创建信封
  • 串行块不适用于 simulink 编码器

    我使用从串行端口接收一些数据信号Serial Receive块 当然还有串行配置块 我用它来移动视频中的标记 它在模拟期间工作 但是当我使用生成 exe 文件时Simulink Coder执行期间标记不会移动 看起来它没有从串行接收数据 E
  • javascript 中的文件路径验证

    我正在尝试在 JavaScript 中验证 XML 文件路径 我的正则表达式是 var isValid a zA Z 2 a zA Z0 9 s 2 xml test str 即使路径错误 它也会返回 true 这些是有效路径 D test
  • Xamarin 表单中的渐变按钮

    如何使用 Renderer 在 Xamarin Forms 中创建具有渐变效果的按钮 现在 Xamarin Forms 4 8 可以提供渐变画笔和拖放功能等新功能 查看此链接 gt https learn microsoft com en
  • 使用 PHP ftp_get() 检索带有通配符文件名的文件

    我在 FTP 上有一个具有动态文件名的文件 该架构看起来像 ABCD 2 EFGH YYMMDD YYMMDD randomnumber TXT 日期 YYMMDD 反映前一天和当天以及randomnumbervalue 是文件中记录的计数
  • Vim - 如果文件包含特定字符串,则阻止保存/写入文件

    我想阻止 Vim 保存包含以下文本的文件 style gt 这可能位于文件中的多个位置 如果它能提出诸如 停止将样式内联 之类的错误消息 那就太好了 那也很棒 Thanks PS 我希望在尝试写入文件时触发此阻止操作 w One way 做
  • 如何为适合不同类别的标记显示不同的图标?

    我正在尝试制作一个谷歌地图 它允许用户勾选一个类别并显示这些特定位置 我已经让那部分工作了 http thedenvillehub com test hs adv scripts test html 我想做的是为每个类别提供不同的图标 一个
  • IO6 不调用 -(BOOL)shouldAutorotate

    我的应用程序中有一些我不想支持方向的视图 在didFinishLaunchingWithOptions我添加导航 UINavigationController nav UINavigationController alloc initWit
  • Keras 和错误:使用序列设置数组元素

    我在神经网络中输入多个数据源时遇到问题 我的数据框是 0 1 2 3 4 0 True True False 3 1 False True True 1 输入与前 4 列相关 输出与最后一列相关 当我训练我的神经网络时 我得到Setting
  • 如何自定义 LESS 生成的 CSS 以包含 Font Awesome?

    我要定制引导程序的CSS通过分层字体真棒作为替代品Bootstrap 默认字形 如何自定义 LESS 生成的 CSS 以包含 Font Awesome 并且在更新核心 Bootstrap 文件时不会中断 Note Font Awesome
  • 连接到我的程序时出现奇怪的行为

    我正在使用 Twisted 来实现某种服务器 当我测试它时 它收到的第一行总是很奇怪 Starting Server New connection from 192 168 1 140 192 168 1 140 NAME Blurr 19
  • 在 SQL Server 中,如何通过链接服务器连接查询 Oracle Timestamp 列?

    我在 oracle 中进行的查询不适用于带有 sql server 2008 的链接服务器 为链接服务器 ORACLE 提供的 OLE DB 提供程序 MSDAORA 列 DATETIME INS 的元数据无效 数据类型不是 支持的 查询
  • 终极清洁/安全功能

    我有很多用户输入 GET and POST 此刻我总是写mysql real escape string GET var 我想知道你是否可以制作一个功能来保护 转义和清理 GET POST立即数组 因此您不必每次处理用户输入等时都处理它 我
  • 实体框架存储过程和 POCO

    我需要有关使用 Entity Framwork 4 x 存储过程将数据返回到 POCO 对象的建议 我不想将数据从实体对象复制到 POCO 对象 我想执行一个存储过程并将数据直接加载到我的 POCO 类中 有没有办法做到这一点 我是否需要像
  • Collections.sort(...) 是如何工作的?

    需要明确的是 我试图找出 Collections sort list new MyComp 方法如何按顺序调用比较方法 我有一个包含员工及其个人号码 k 的 LinkedList 数字是 1 2 3 4 5 6 MyComparator 中
  • Drupal 共享表,但来自另一个数据库

    我有一个包含数百个站点的 Drupal Multisite 我想共享一些表格 例如横幅和角色 这样我就不必在更改横幅时更新数百个站点 例如 我知道这可以使用 settings php 中的这些字符串来完成 db url mysql user
  • JTextArea 中特定文本的 ActionListener?

    我的应用程序中有一个聊天组件 其中有一个JTextArea在上面 现在 如何为特定文本 例如student xxxx 添加类似ActionListener 的事件 因此 当我单击该文本 student xxxx 时 就会发生一些事情 谢谢
  • Spring Boot 和 Spring Data:Hibernate 会话如何管理?

    我目前正在开发一个使用 Spring Boot 和 Spring Data 的应用程序 其JpaRepository接口 准确地说 是与 Hibernate 一起使用 我喜欢 Hiberante 的一件事是它的缓存功能 当您提交与特定对象匹
  • 调用 Web 浏览器上下文菜单

    我正在开发一个项目 一个 Web Bot 它使用 WebBrowser 控件 我的目标是以编程方式在加载的 Web 浏览器中的所需元素上打开 Web 浏览器上下文菜单 然后从上下文菜单中选择一个选项 Example 在 WebBrowser