鼠标滚轮事件与悬停控件一起使用

2024-01-05

在我的 C# 3.5 Windows 窗体应用程序中,我有一些 SplitContainer。每个内部都有一个列表控件(停靠填充)。当焦点位于这些控件之一并且我移动鼠标滚轮时,现在获得焦点的列表会滚动。

我的任务是滚动当前由鼠标悬停的列表,而不是选定的列表。在 Windows 窗体中可以吗?如果不行的话,用 PInvoke 可以吗?


看起来你可以使用IMessageFilter和 PInvoke 来处理这个问题。 VB 中的示例可以在以下位置找到将鼠标滚轮事件重定向到未聚焦的 Windows 窗体控件 http://www.codeproject.com/Articles/280310/Redirect-Mouse-Wheel-Events-To-Unfocused-Windows-F。您应该能够轻松地将其转换为 C#。

兴趣点

此类针对给定任务使用以下技术:

  • 侦听控件的 MouseEnter 和 MouseLeave 事件以确定鼠标指针何时位于控件上方。
  • 实现 IMessageFilter 以捕获应用程序中的 WM_MOUSEWHEEL 消息。
  • PInvoke Windows API 调用 SendMessage,将 WM_MOUSEWHEEL 消息重定向到控件的句柄。
  • IMessageFilter 对象作为 MouseWheelRedirector 类的单例实现,并由共享成员 Attach、Detach 和 Active 访问。

Using VB.NET 到 C# 转换器 http://www.developerfusion.com/tools/convert/vb-to-csharp/,这就是你最终得到的结果:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;

using System.Windows.Forms;
using System.Runtime.InteropServices;

public class MouseWheelRedirector : IMessageFilter
{
    private static MouseWheelRedirector instance = null;
    private static bool _active = false;
    public static bool Active
    {
       get { return _active; }
       set
       { 
          if (_active != value) 
          {
             _active = value;
             if (_active)
             {
                if (instance == null)
                {
                    instance = new MouseWheelRedirector();
                }
                Application.AddMessageFilter(instance);
             }
             else
             {
                if (instance != null)
                {
                   Application.RemoveMessageFilter(instance);
                }
             }
          }
       }
    }

    public static void Attach(Control control)
    {
       if (!_active)
          Active = true;
       control.MouseEnter += instance.ControlMouseEnter;
       control.MouseLeave += instance.ControlMouseLeaveOrDisposed;
       control.Disposed += instance.ControlMouseLeaveOrDisposed;
    }

    public static void Detach(Control control)
    {
       if (instance == null)
          return;
       control.MouseEnter -= instance.ControlMouseEnter;
       control.MouseLeave -= instance.ControlMouseLeaveOrDisposed;
       control.Disposed -= instance.ControlMouseLeaveOrDisposed;
       if (object.ReferenceEquals(instance.currentControl, control))
          instance.currentControl = null;
    }

    private MouseWheelRedirector()
    {
    }


    private Control currentControl;
    private void ControlMouseEnter(object sender, System.EventArgs e)
    {
       var control = (Control)sender;
       if (!control.Focused)
       {
          currentControl = control;
       }
       else
       {
          currentControl = null;
       }
    }

    private void ControlMouseLeaveOrDisposed(object sender, System.EventArgs e)
    {
       if (object.ReferenceEquals(currentControl, sender))
       {
          currentControl = null;
       }
    }

    private const int WM_MOUSEWHEEL = 0x20a;
    public bool PreFilterMessage(ref System.Windows.Forms.Message m)
    {
       if (currentControl != null && m.Msg == WM_MOUSEWHEEL)
       {
          SendMessage(currentControl.Handle, m.Msg, m.WParam, m.LParam);
          return true;
       }
       else
       {
          return false;
       }
    }

    [DllImport("user32.dll", SetLastError = false)]
    private static extern IntPtr SendMessage(
       IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

鼠标滚轮事件与悬停控件一起使用 的相关文章

随机推荐

  • 在 Android Studio 2.3 上创建项目时出错

    我已将 Android Studio 从 2 2 升级到 2 3 当我创建带有导航活动的新 Android 项目时 出现两个错误 Error java util concurrent ExecutionException java lang
  • Java 9 的 Maven 编译问题

    尝试使用 JDK 9 0 1 编译 Maven 项目时 我遇到了这个堆栈跟踪 但没有太多解释 Exception in thread main java lang AssertionError at jdk compiler com sun
  • 使用 C# 为所有桌面快捷方式创建自定义右键单击上下文菜单项(Windows 资源管理器)

    问题很简单 我有很多桌面快捷方式 它们指向很多文件 但我也有很多快捷方式 它们指向这些快捷方式所指向的目录 我想通过简单地为所有快捷方式 lnk 文件 添加另一个右键菜单选项来消除这种冗余 该选项允许您将 explorer exe 打开到包
  • 使用 Google Apps 脚本将 Google 表格中的行追加到 Big Query 中的现有表

    我有一个 Google 表格 我想从中选择一些单元格并将它们作为行附加到 Big Query 中已存在的表格中 我编写了以下代码 运行时没有任何错误 但是当我检查 BQ 中的表时 它没有更新 function myFunction var
  • 让 MATLAB Mex 搜索特定文件夹中的库

    我创建了一个 mex 函数 它依赖于一个依赖于另一个库的库 当我执行该函数时 它在运行时输出以下错误 Invalid MEX file Library not loaded usr local lib libgomp 1 dylib 我的计
  • WPF 检查系统上是否安装了 python

    我的 wpf 应用程序调用 python 脚本来生成输出 稍后显示在 UI 中 如果用户系统上未安装 python 为了避免应用程序崩溃 我需要执行检查 目前我已经使用以下方法实现了这一点 ProcessStartInfo start ne
  • Groovy 重写compareTo

    我正在使用 Groovy 类别在 DSL 下工作 我需要覆盖 重载 操作员 然而却是已知问题 http jira codehaus org browse GROOVY 3364 当类实现Comparable Groovy 会调用compar
  • ORA-01830: 日期格式图片在转换整个输入字符串之前结束

    SQL 在大多数安装上都可以正常工作 但是 我在加拿大安装 Oracle 时遇到问题 可能是日期本地化问题 http www google com search q ORA 01830 http www google com search
  • 如何在 C 中将 double 转换为 int?

    double a a 3669 0 int b b a 我在 b 中得到 3668 而不是 3669 我该如何解决这个问题 如果有 3559 8 这样的我也想要 3559 而不是 3560 我怀疑你不知道actually有这个问题 我怀疑你
  • 同义词分析器不工作

    这是我的设置 countries aliases mappings country properties countryName type string settings index creation date 1472140045116
  • (Perl) 从文件读取字符串时是否可以插入变量?

    我正在编写一个脚本 其中有一些变量传递给字符串 然后将它们打印出来 初始字符串只有 6 行 我不需要外部文件 但现在我有了一个可以填充 1000 多行的新字符串 新字符串还有一些字段将被脚本中声明的变量替换 文本文件内容如下 Hello n
  • 如何在 Android 中以编程方式锁定屏幕? [复制]

    这个问题在这里已经有答案了 可能的重复 以编程方式锁定 Android 设备 https stackoverflow com questions 4545079 lock the android device programatically
  • 在 Docker 中向 Golang 应用程序发送信号

    我正在尝试在 docker 容器内运行用 golang 编写的服务器 例如 package main import net http func main http HandleFunc func w http ResponseWriter
  • Javascript 从 UIWebView 调用 Swift

    我正在尝试从 UIWebView 中的 javascript 函数调用 iOS 10 中的 Swift 我设置了一个非常基本的项目只是为了尝试使其正常工作 代码如下 import UIKit class ViewController UIV
  • django 变量可用于所有视图

    使用 context processors 可以轻松定义一个可调用的结果变量可供所有模板使用 是否有任何类似的技术可以使变量可用于所有视图 这有可能吗 也许有一些解决方法 姜戈 2 2 蟒蛇 3 5 3 您可能想要实现自定义中间件 http
  • 如何终止 Neo4j 中当前长时间运行的查询

    如何终止 Neo4j 中当前长时间运行的查询 无需重新启动服务器 我知道我们可以在全球范围内设置查询超时 https groups google com forum topic neo4j 5ec8FThLTeo 但有时我想在服务器上执行繁
  • vbs安静而优雅的taskkill所有chrome进程

    这段代码有什么办法吗 Dim oShell Set oShell WScript CreateObject WScript Shell oShell Run taskkill im chrome exe 0 True 我希望它关闭所有正在运
  • 如何在ajax中调用Struts2 Action方法?

    如何在ajax中调用Struts2 Action方法 现在我仍然在调用servlet 有没有可能 如果有请分享 更新struts xml as
  • Gtk ComboBox 宽度基于内容

    我正在动态地将选项填充到具有条目的 GTK3 ComboBox 有些选项可能会很长 如果我的模型中有宽的项目 我希望能够使组合框更宽 有没有办法做到这一点 如果组合框可以自动扩展但可以设置上限 那就太好了 None
  • 鼠标滚轮事件与悬停控件一起使用

    在我的 C 3 5 Windows 窗体应用程序中 我有一些 SplitContainer 每个内部都有一个列表控件 停靠填充 当焦点位于这些控件之一并且我移动鼠标滚轮时 现在获得焦点的列表会滚动 我的任务是滚动当前由鼠标悬停的列表 而不是