鼠标滚轮滚动工具条菜单项

2023-12-14

我有一些包含许多菜单项的菜单。鼠标滚轮不会滚动它们。我必须使用键盘箭头或单击顶部和底部的箭头。 是否可以使用鼠标滚轮滚动工具条菜单项? 谢谢


您可以使用此类在应用程序范围内启用它:

public class DropDownMenuScrollWheelHandler : System.Windows.Forms.IMessageFilter
{
    private static DropDownMenuScrollWheelHandler Instance;
    public static void Enable(bool enabled)
    {
        if (enabled)
        {
            if (Instance == null)
            {
                Instance = new DropDownMenuScrollWheelHandler();
                Application.AddMessageFilter(Instance);
            }
        }
        else
        {
            if (Instance != null)
            {
                Application.RemoveMessageFilter(Instance);
                Instance = null;
            }
        }
    }
    private IntPtr activeHwnd;
    private ToolStripDropDown activeMenu;

    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == 0x200 && activeHwnd != m.HWnd) // WM_MOUSEMOVE
        {
            activeHwnd = m.HWnd;
            this.activeMenu = Control.FromHandle(m.HWnd) as ToolStripDropDown;
        }
        else if (m.Msg == 0x20A && this.activeMenu != null) // WM_MOUSEWHEEL
        {
            int delta = (short)(ushort)(((uint)(ulong)m.WParam) >> 16);
            handleDelta(this.activeMenu, delta);
            return true;
        }
        return false;
    }

    private static readonly Action<ToolStrip, int> ScrollInternal
        = (Action<ToolStrip, int>)Delegate.CreateDelegate(typeof(Action<ToolStrip, int>),
            typeof(ToolStrip).GetMethod("ScrollInternal",
                System.Reflection.BindingFlags.NonPublic
                | System.Reflection.BindingFlags.Instance));

    private void handleDelta(ToolStripDropDown ts, int delta)
    {
        if (ts.Items.Count == 0)
            return;
        var firstItem = ts.Items[0];
        var lastItem = ts.Items[ts.Items.Count - 1];
        if (lastItem.Bounds.Bottom < ts.Height && firstItem.Bounds.Top > 0)
            return;
        delta = delta / -4;
        if (delta < 0 && firstItem.Bounds.Top - delta > 9)
        {
            delta = firstItem.Bounds.Top - 9;
        }
        else if (delta > 0 && delta > lastItem.Bounds.Bottom - ts.Height + 9)
        {
            delta = lastItem.Bounds.Bottom - owner.Height + 9;
        }
        if (delta != 0)
            ScrollInternal(ts, delta);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

鼠标滚轮滚动工具条菜单项 的相关文章

随机推荐

  • hadoop getmerge到另一台机器

    是否可以存储输出hadoop dfs getmerge命令到另一台机器 原因是我的本地机器没有足够的空间 作业输出为 100GB 我的本地存储为 60GB 另一个可能的原因可能是我想在另一台机器上本地处理另一个程序中的输出 并且我不想将其传
  • R data.table 使用标准名称创建新列

    我想根据比率计算为我的 data table 创建新列 我的变量的名称有点标准 所以我认为必须有一种方法可以轻松实现这一点数据表 但是我不知道如何实现这一点 以下是我的示例数据和代码 set seed 1200 ID lt seq 1001
  • 复数 FFT 然后逆 FFT MATLAB

    我正在使用 Matlab 中的 FFT 函数来尝试分析行波激光模型的输出 模型的时域形式为 实数 虚数 其思想是将 FFT 应用于复数输出 以获得频域中的相位和幅度信息 load time domain field data data lo
  • 为什么我不能使用 boost::variant 访问这个自定义类型?

    下面的代码 include
  • 如何通过 Gmail 使用简单的 SMTP 命令发送电子邮件?

    出于教育目的 我需要使用 SMTP 的基本且简单的规则通过 SMTP 服务器发送电子邮件 我能够使用smtp4dev I telnet localhost 25和 命令是 我想做同样的事情 使用 Gmail SMTP 服务器 但是 它需要身
  • 如何按两个值对这个元组列表进行排序?

    我有一个元组列表 2 Operation SUBSTITUTED 1 Operation DELETED 2 Operation INSERTED 我想用两种方式对此列表进行排序 首先按升序排列第一个值 即1 2 3 etc其次是按相反字母
  • 如何处理 Start-Job 中运行命令的错误?

    我正在编写一个自动化脚本 我有一个函数 它接受命令或可执行文件 我必须等到命令或可执行文件完成运行并在失败或通过时返回 我还想将输出写入文件 我正在尝试与Start Job cmdlet 我当前的代码 job Start Job scrip
  • 与对象更改通知相比,Google Club Pub/Sub 的可扩展性如何

    正如标题所问 当使用签名 URL 上传对象时 与 Google Cloud Storage 中的对象更改通知相比 Google Club Pub Sub 的可扩展性如何 在能够处理短时间内上传的许多对象方面 每种方法的比较如何 如果上传的对
  • 如何将 Robomongo 连接到 MongoDB

    我的运行系统中有 MongoDB 和 Robomongo 并且我使用 Robomongo 作为客户端 我已经在另一个系统上安装了 MongoDB 我将其视为服务器 并且我想将我的系统 作为客户端 的 Robomongo 连接到另一个系统 服
  • 将值添加到选定的多选

    我想知道是否可以动态添加新值选择 js多重选择 类似于标记的工作方式 我在另一个看到过SO post用户说这是可能的 他链接到一个example and a fork在 github 上 但我在实现这些方面遇到了一些困难 源代码是用 Cof
  • 使用开源库时,我们应该针对源代码还是二进制文件进行编译? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在项目中使用开源库 例如 SharpPcap 或 FakeItEasy 时 我们应该将源代码添加到解决方案中还是针对 DLL 进行编译并将它们放在解决方案中的目录中 您应该使用二进制文件进
  • 检查应用程序是否在前台或后台运行(使用同步适配器)

    我知道这是一个重复的问题 但我查遍了所有地方 找不到适合我的解决方案 所以 我有一个从 TMDB API 获取电影数据的应用程序 它使用同步适配器按页获取它 基本上它运行得很好 除非在应用程序打开且用户不在第一页时运行同步适配器的定期同步
  • MySQL 服务器在 Perl 爬行期间消失了

    我使用 WWW Mechanize 库来获取 URL 的内容并将其数据保存到 mysql 表中 但是当页面内容太大时 会出现以下错误消息 DBD mysql st 执行失败 MySQL 服务器已消失 F crawling perl test
  • 正则表达式删除字符串中的最后一个单词+附加字符

    我从服务器获取一个字符串 我必须使用正则表达式来解析它 我知道如何使用字符串函数 String split 等 来做到这一点 但不知道如何使用正则表达式 这是家庭作业要求中的 字符串看起来像这样 12345
  • 为什么该决策树每一步的值之和不等于样本数?

    我正在阅读有关决策树和装袋分类器的内容 并且我试图展示装袋分类器中使用的第一个决策树 我对输出感到困惑 from sklearn model selection import train test split from sklearn da
  • 为什么我收到 You do not have permission to call SpreadsheetApp.openById?

    我们有两张 AL 表 本地的和国家的 我正在尝试获取它 以便当我们当地的 AL 日历 完成时 数据会复制到国家日历中 检查编辑的单元格是否位于国家电子表格中某人的行中 然后将其复制到国家电子表格上的相应行中 我不断得到 您无权调用 Spre
  • 如何在 Android 中制作自定义键盘? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想做一个定制键盘 我不知道如何使用 XML 和 Java 来做到这一点 下图是我想做的键盘模型 它只需要数字 系统键盘 此答案告诉您如何制作可在用户安装在手机上的任何应用程序中
  • 快速字节校验和

    我有一个非常棘手的问题 我使用 iOS 设备将字节数组发送到 ble 设备 led 灯 效果很好 我有一个所有命令的文档 但中文翻译得很差 整个字节包的构建如下 命令前面 1字节 命令包长度 1字节 命令的ID 1字节 命令的控制部分 1字
  • 如何向我的 Facebook 登陆选项卡添加“喜欢”按钮?

    我的 Facebook 页面经过设置 以便向尚未 喜欢 该页面 并尝试查看该页面 的用户显示特定选项卡的内容 而不是默认的 墙 视图 这些用户到达的选项卡包含我制作的应用程序 这是一个简单的应用程序 列出了有关业务的信息 该应用程序正在使用
  • 鼠标滚轮滚动工具条菜单项

    我有一些包含许多菜单项的菜单 鼠标滚轮不会滚动它们 我必须使用键盘箭头或单击顶部和底部的箭头 是否可以使用鼠标滚轮滚动工具条菜单项 谢谢 您可以使用此类在应用程序范围内启用它 public class DropDownMenuScrollW