将 MouseWheel 消息发送到 System.Windows.Forms.WebBrowser

2024-01-24

我想转发MouseWheel在表单级别生成的事件,以便它们将由嵌入式处理WebBrowser控件,即使该控件没有焦点。

这是我所做的:

  1. 实施的IMessageFilter.PreFilterMessage.
  2. 注册了过滤器Application.AddMessageFilter.
  3. 在过滤器中,聆听WM_MOUSEWHEEL消息。
  4. 使用转发消息SendMessage到目标控件(在我的例子中WebBrowser).

在代码中,这看起来像这样:

bool IMessageFilter.PreFilterMessage(ref Message m)
{
    if (m.Msg == 0x20A)     //  WM_MOUSEWHEEL
    {
        if (this.target != null)
        {
            var handle = this.target.Handle;
            Native.SendMessage (handle, m.Message, m.WParam, m.LParam);
            return true;
        }
    }
    return false;
}

// Registering the message filter:

System.Windows.Forms.Application.AddMessageFilter (this);

// Win32 code:

protected static class NativeMethods
{
    [System.Runtime.InteropServices.DllImport ("user32.dll")]
    public static extern System.IntPtr SendMessage(System.IntPtr hWnd, System.Int32 Msg, System.IntPtr wParam, System.IntPtr lParam);
}

这是行不通的。什么都没发生。

但是,如果不是WebBrowser我指定一个Panel作为目标,那么这效果非常好。


皮埃尔的答案对我有用(由于声誉不够,无法投票)。然而,它需要进行一些调整才能在 VB.NET 中工作,所以我想我应该发帖以防有人陷入这一点:

Imports System.Runtime.InteropServices

Public Class Form1 Implements IMessageFilter

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        System.Windows.Forms.Application.AddMessageFilter(Me)

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Me.WebBrowser1.Navigate("D:\Development\test3.html")
    End Sub

    Private Function IMessageFilter_PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage

        If m.Msg = &H20A Then
            '  WM_MOUSEWHEEL

            If m.HWnd <> 0 Then
                Dim handle = m.HWnd
                handle = NativeMethods.FindWindowEx(handle, IntPtr.Zero, "Shell Embedding", Nothing)
                handle = NativeMethods.FindWindowEx(handle, IntPtr.Zero, "Shell DocObject View", Nothing)
                handle = NativeMethods.FindWindowEx(handle, IntPtr.Zero, "Internet Explorer_Server", Nothing)
                NativeMethods.SendMessage(handle, m.Msg, m.WParam, m.LParam)
                Return True
            End If

        End If

        Return False

    End Function

    Protected NotInheritable Class NativeMethods
        Private Sub New()
        End Sub
        <System.Runtime.InteropServices.DllImport("user32.dll")> _
        Public Shared Function SendMessage(hWnd As System.IntPtr, Msg As System.Int32, wParam As System.IntPtr, lParam As System.IntPtr) As System.IntPtr
        End Function

        <System.Runtime.InteropServices.DllImport("user32.dll")> _
        Public Shared Function FindWindowEx(hwndParent As System.IntPtr, hwndChildAfter As System.IntPtr, className As String, windowName As String) As System.IntPtr
        End Function
    End Class


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

将 MouseWheel 消息发送到 System.Windows.Forms.WebBrowser 的相关文章

  • 我们如何将数据从一个打开的表单传递到另一个打开的表单?

    winform中如何将数据从一个窗体传递到另一个打开的窗体 在 Windows 应用程序中 一个窗体打开另一个窗体 当我在父表单中输入一些数据时 这些数据将立即反映在另一个子表单中 这将如何发生 取决于你想要多花哨 最简单的方法就是直接调用
  • C#设置ListView的Item的Subitem的文本不显示

    我在这里有点失去理智了 当我最初构建 ListView 时 它完全按预期工作 ListViewItem listViewItem listView Items Add model Id ToString model Name model I
  • Winform 上的 C# ComboBox 是否有 BeforeUpdate

    我来自 VBA 世界 记得有一个BeforeUpdate我可以在组合框上进行调用 现在我使用 C 并且喜欢它 我想知道是否有一个BeforeUpdate呼吁ComboBox在 Winform 上 我可以制作一个不可见的文本框并在那里存储我需
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • 在 C# 中从另一个子窗体调用一个子窗体

    我有3种表格 FormS FormS和FormS 其中FormAT是mdiParent表格 表格B和C是子表格 我在 FormA 加载事件中编写以下代码 private void frmMain Load object sender Eve
  • 将组合框添加到 DataGridView 标头

    当我运行代码时 dataGridView TopLeftHeaderCell 也有一个组合框 我怎样才能改变这一点 这是我的代码 public void AddHeaders DataGridView dataGridView for in
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 当进程等待完成时如何显示加载控件?

    我决定使用这个第三方组件在我的 Windows 窗体中制作一个简单的加载控件 http www codeproject com Articles 14841 How to write a loading circle animation i
  • 以编程方式更改 DataGridView 行上的只读模式

    在不解释整个上下文的情况下 我的问题基本上是这样的 我在 Windows 窗体上有一个 datagridview 它绑定到实体框架 DbSet dbSet
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • 我应该如何缓冲绘制的矩形以提高性能(C#/.NET/WinForms/GDI+)

    我在做什么 我正在开发一个 C NET 4 7 2 WinForms 应用程序 它使用以下命令在表单上绘制大量填充矩形Graphics FillRectangle https learn microsoft com en us dotnet
  • 从 Form2 访问 Form1 控件

    有两个表单 Form1和Form2 Form1有一个按钮 btnNew 单击时打开Form2 并且被禁用 我需要再次启用该按钮 只有当Form2关闭时 用户也需要同时使用Form1 这段代码不再启用该按钮 我哪里失踪了 在表格1中 priv
  • 将 Windows 窗体应用程序转换为 Asp.net

    我问的是 您之前使用的将 C Windows 窗体应用程序转换为 ASP NET 的最佳工具是什么 我已经关于这个主题 发现了很多工具 但我希望有人根据他的使用情况推荐最好的工具 我真的不建议使用工具来进行转换 Web 应用程序和 WinF
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 有没有办法禁用 .NET 标签的“双击复制”功能?

    这真的很烦人 我使用标签作为列表项用户控件的一部分 用户可以单击它来选择列表项 然后双击它来重命名它 但是 如果剪贴板中有名称 双击标签会将其替换为标签文本 我还检查了应用程序中的其他标签 双击它们也会将其复制到剪贴板 我没有在这个程序中编
  • 如何以编程方式向 datagridview 添加新行

    如果将行添加到DataTable DataRow row datatable1 NewRow row column2 column2 row column6 column6 datatable1 Rows Add row 怎么样DataGr
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 当文本框中有字符串时如何启用按钮?

    我在 form2 中有一个文本框和一个按钮 当单击 form1 中的某个项目时 将出现 form2 我想在文本框为空时保持 form2 中的按钮处于禁用状态 但是当用户开始输入时 我想启用该按钮 我尝试在构造函数中像这样在initialis
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我

随机推荐

  • 如何获取最接近的元素id属性

    我试图找到最接近的具有 id 属性的元素并获取id 该元素可以是 p p div 或其他元素 我努力了 element test closest div id attr id 但只有当元素是 a 时它才会获取 iddiv 我想变得更加普遍
  • 为什么不读/写其内容的结构体的方法仍然会导致竞争情况?

    From 戴夫 切尼博客 http dave cheney net 2015 11 18 wednesday pop quiz spot the race 以下代码显然会导致竞争情况 只需更改即可解决func RPC version int
  • NTP 对于分布式时间同步有多好?

    NTP 用于保持一组服务器时间同步的准确度如何 我正在编写一项服务 需要一组服务器 一些充当客户端 一些充当服务器 同步到二级粒度 我想知道 NTP 是否是最好使用的东西 或者是否有更好的东西 我应该在其中一个上运行 ntp 服务器 并让其
  • 如何从多个接口组成一个 WCF 合约?

    我有多个接口 所有这些都应该由单个合约接口继承和公开 interface A void X interface B void Y interface C A B this is the public contract 这怎么可能 我无法将
  • 如何将 Visual Studio .NET 2008 解决方案转换为 Visual Studio .NET 2005?

    假设解决方案仅包含类 并且这些类全部按照 NET 2 0 规范编写 如果要在 Visual Studio 2008 中打开 转换和保存该解决方案 是否可以稍后在 Visual Studio 2005 中重新打开该解决方案 并对 SLN 文件
  • 根据多年每日天气数据计算每日平均值?

    我有从 1984 年到 2014 年 31 年的每日数据 我想计算变量的 31 年的每日平均值 date Min daily Max daily Rain daily 01 01 1984 18 8 3 6 0 02 01 1984 20
  • 将 DataGridView 内容复制到剪贴板

    我想复制 DataGridView 的内容并将其粘贴到 Excel 中 我试过 myDataGrid SelectAll DataObject dataObj myDataGrid GetClipboardContent Clipboard
  • android中如何保存数据结构?

    我想存储这样的结构中的一些数据 class Project ChildA a ChildB b class ChildA ChildC c 我创建了如下数据 Projet x new Project x a new ChildA x a c
  • Tensorflow 2.0 数据集和数据加载器

    我是一个pytorch用户 我习惯了pytorch中的data dataset和data dataloader api 我正在尝试使用tensorflow 2 0构建相同的模型 我想知道pytorch中是否有与这些api类似的api 如果没
  • 如何检查网络端口是否开放?

    我如何使用 python 知道 linux ubuntu 而不是远程系统 上的某个端口是否打开 关闭 如何在 python 中列出这些开放端口 网络统计 有没有办法将 netstat 输出与 python 集成 您可以使用插座模块 http
  • 使 Google 可视化 - 注释图表在 GWT 中工作

    我正在使用新发布的注释图表 https developers google com chart interactive docs gallery annotationchart在 gwt 中通过调用本机 javascript 到目前为止我得
  • 在 RecyclerView 上快速点击(点击)会打开多个 Fragments

    我已经为 RecyclerView 的 ViewHolder 实现了 onClick 侦听器 但是 当我执行非常快速的双击或鼠标单击时 它会执行该任务 在本例中打开一个单独的片段 两次或三次 这是我的代码 public class View
  • lambda 的仅类型模板参数

    想象一下我有这个结构 struct Foo operator int return 11 operator unsigned int return 22 foo 当此结构体转换为 int 时 它返回 11 但当转换为 unsigned in
  • 如何在 emacs 中获得“彩虹括号”?

    我想要在 Emacs 中编辑 Clojure 的彩虹括号 因为六是这样做的 http www vim org scripts script php script id 1230我认为在 Emacs 中它应该是类似 M x Butterfly
  • 将原始 SQL 查询与 Sequelize ORM 和文字结合使用

    使用 Sequelize ORM 我尝试更新字段 level id 其中该字段具有指向另一个名为 level tbl 的表中的字段 Level 的外键 select from level tbl level id Level 1 Highe
  • 字符串数组中的不兼容指针类型警告

    我正在尝试 C 中的字符串数组 我有一个字符串字典数组 我向其中添加单词 然后打印出该数组以查看它是否有效 输出有效 正如我认为的那样 打印数组中的单词 但我收到了许多无法修复的警告 20 word dictionary define RO
  • 颜色少于顶点

    在旧的已弃用的 OpenGL 中 我们可以这样做 glBegin glColor3f r 1 g 1 b 1 glVertex3f x 1 y 1 z 1 glVertex3f x 2 y 2 z 2 glVertex3f x n y n
  • iOS UIWebView 完全无法理解多个@font-face?

    请注意这个简单的 css html 它显示在本地 UIWebView 中 有模拟器显示它 请注意 有两个 font face 定义 But 只有第二个有效 如果你交换它们 只有第二个有效 所以在这里 font face font famil
  • Spring 项目突然无法加载上下文 - 没有代码更改

    我正在开发一个使用 Spring Data JPA 的 Spring 3 应用程序 昨天 该项目在 TeamCity 中构建良好 但今天构建在本地和构建服务器上失败没有任何代码更改 堆栈跟踪提到了命名空间处理程序 这是配置文件的命名空间部分
  • 将 MouseWheel 消息发送到 System.Windows.Forms.WebBrowser

    我想转发MouseWheel在表单级别生成的事件 以便它们将由嵌入式处理WebBrowser控件 即使该控件没有焦点 这是我所做的 实施的IMessageFilter PreFilterMessage 注册了过滤器Application A