【问题标题】:How to get mouse wheel state ?如何获得鼠标滚轮状态?
【发布时间】:2013-06-27 18:34:27
【问题描述】:

在 Microsoft.NET Framework 中,命名空间中有一个名为 System.Windows.Forms 的 Form 类,其中定义了许多事件。 KeyPressed 事件发生在窗体本身具有输入焦点时在键盘上按下一个键的那一刻。但是,如果我希望无论窗体是否具有输入焦点,在任何时候按下某个键时都会发生一些事情,我知道我可以运行一个计时器,然后 dll 从 user32.dll 中导入 GetKeyState 或 GetAsyncKeyState 函数,并且知道任何时候按下一个键。

我可以通过 Form 的 MouseDown 事件和不使用鼠标执行相同的操作,使用相同的 user32.dll 函数和计时器,但是当我向上或向下滚动鼠标滚轮时,我可以编程会发生某些事情窗体的 MouseDown 事件。

Delta 是 MouseEventArgs 中鼠标滚轮事件的值,但它不仅会在鼠标滚轮向上或向下滚动时发生,而且我需要使用 MouseEvent 在该表单上输入焦点。

我不想依赖任何形式。我不知道将哪个整数赋予 GetKeyState 或 GetAsyncKeyState 函数以获取鼠标滚轮的状态,因此我可以在计时器频繁调用的函数的 if 中运行一段代码。

我该怎么办?它是哪个整数?是否有来自 user32 或其他 dll 的其他函数可以返回“Delta”? 如果我知道我会很高兴,所以请回答! :D

【问题讨论】:

  • 这篇关于拦截全局鼠标事件的文章你可能会感兴趣:codeproject.com/Articles/29726/Detect-System-Wide-Mouse-Events
  • 这不是它的工作方式。当用户滚动鼠标滚轮时,Windows 会通知您,即触发 MouseWheel 事件。没有办法问它在哪里,鼠标滚轮没有“位置”。只有改变很重要。
  • 我下载了您发送给我的代码项目 pwny,但是当我尝试使用添加引用添加 MouseHunter.dll 时,我收到一个错误:错误标题 - “Microsoft Visual C# 2010 Express”,错误描述- “无法添加对‘Drive:\Path\MouseHunter\MouseHunter.dll’的引用。请确保该文件是可访问的,并且它是一个有效的程序集或 COM 组件。”,并且 dll 引用不是添加。为什么我会收到此错误?

标签: c# mouseevent


【解决方案1】:

有一个非常好的CodePlex library 可以让您轻松获取全局鼠标和键盘事件。

来自上述链接的描述:

即使应用程序处于非活动状态并在后台运行,此库也允许您点击键盘和鼠标并检测和记录它们的活动。

此库附加到 Windows 全局挂钩,跟踪键盘和鼠标的点击和移动,并使用 KeyEventArgs 和 MouseEventArgs 引发常见的 .NET 事件,因此您可以轻松检索所需的任何信息:鼠标坐标

  • 鼠标按钮被点击
  • 鼠标滚轮滚动
  • 按键和释放
  • 特殊键状态

示例(从 Demo 程序修改)它只会给你 Delta:

using System;
using System.Windows.Forms;
using MouseKeyboardActivityMonitor;
using MouseKeyboardActivityMonitor.WinApi;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private readonly MouseHookListener m_MouseHookManager;

        public Form1()
        {
            InitializeComponent();

            m_MouseHookManager = new MouseHookListener(new GlobalHooker());
            m_MouseHookManager.Enabled = true;

            m_MouseHookManager.MouseWheel += HookManager_MouseWheel;

        }

        private void HookManager_MouseWheel(object sender, MouseEventArgs e)
        {
            labelWheel.Text = string.Format("Wheel={0:000}", e.Delta);
        }
    }
}

【讨论】:

  • 我已经下载了你发给我的 CodePlex 库。这正是我正在寻找的答案,但是当我将类库项目添加到我自己的项目和引用中时,我尝试将在该项目中找到的类和事件使用到我的项目代码中,但是当我运行应用程序时,我得到名为“Win32 异常未处理”的运行时异常错误:“找不到指定的模块”为什么会这样!?
  • 首先,您不必将项目添加到您的项目中,您只需将 dll 添加到您的引用中,并使用他们的演示作为示例如何连接它。稍后我会尝试在答案中添加一个小例子。
  • 另请查看question 和 Hans referred 在他的评论中的内容,看来某些较旧的操作系统和 .Net 4.0 可能存在问题
  • 我添加了您推荐我下载的项目的所有引用,并尝试了上面的示例,但我发现我也无法使用或导入 MouseKeyboardActivityMonitor 和 MouseKeyboardActivityMonitor.WinApi。他们还是陌生的。请帮忙!
  • 没有看到你的代码,我不知道。我上面发布的代码是一个完整的工作示例。确保您使用的 dll 与您的项目类型相同,并且您实际上将对该 dll 的引用添加到您的引用中。您可以尝试将您的代码发布到 pastebin 或类似网站上。
【解决方案2】:

您可以通过添加引用工具将以下文件添加到您的项目中: Microsoft.DirectX.dllMicrosoft.DirectX.DirectInput.dll,然后在您的代码中添加两个命名空间:“使用 Microsoft.DirectX;”和“使用 Microsoft.DirectX.DirectInput;”。

这些文件可以在您的计算机中找到:

  • 它们位于驱动器 C。
  • 路径是:Windows => Microsoft.NET => DirectX for Managed Code => 1.0.2902.0
  • 您可以按键盘上的字母更快地找到每个文件夹或目录。
  • 您可以使用“我的电脑”中的“搜索”工具来查找它们的确切位置,或验证它们是否存在于您的计算机中。如果没有,那么您可以从互联网上下载它们,然后在任何您想要的位置找到它们。

完成上述所有步骤后,您可以通过选择您为他提供 SystemGuid.Mouse 的重载构造函数,在代码中的任何位置创建新的 Device 类型的全局实例。然后在 Main 函数中,您必须调用之前创建的全局 Device 实例的 Acquire() 函数。

之后全局获取鼠标的“Delta”就没有问题了。只需求助于 Device 的全局实例,从他那里获取 CurrentMouseState,然后请求作为整数结构(int 或 System.Int32)的 Z 属性值。这正是鼠标“Delta”。 Z > 0 = 鼠标滚轮向上滚动,Z

注意:在您的项目中使用 Microsoft.DirectX 需要您在项目属性中以 4.0 版本为目标,因为它不支持它。如果您忘记进行此更改,您将面临问题!

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多