3

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

我可以用鼠标用 Form 的 MouseDown 事件来做同样的事情,用相同的 user32.dll 函数和计时器,但是当我向上或向下滚动鼠标滚轮时,我可以编程使 Form 的 MouseDown 事件会发生一些事情.

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

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

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

4

2 回答 2

3

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

来自上述链接的描述:

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

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

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

示例(从演示程序修改)它只会为您提供 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);
        }
    }
}
于 2013-06-27T19:00:07.083 回答
0

您可以通过添加引用工具将以下文件添加到您的项目中: 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,然后请求 Z 属性值,它是一个整数结构(int 或 System.Int32)。这正是鼠标“Delta”。Z > 0 = 鼠标滚轮向上滚动,Z < 0 = 鼠标滚轮向下滚动,Z == 0 = 鼠标滚轮现在没有滚动。

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

于 2013-07-04T17:51:19.467 回答