在Microsoft.NET Framework中,名称空间中有一个名为System.Windows.Forms的Form类,并且在那里定义了许多事件。事件KeyPressed发生在键盘上按下键时,表单本身具有输入焦点。但是如果我想要在任何时候按下某个键时会发生某些事情,无论Form是否有输入焦点,我知道我可以运行一个计时器,并从user32.dll中输入GetKeyState或GetAsyncKeyState函数,并知道当任何时候按下一把钥匙。
我可以用Form的MouseDown事件使用鼠标做同样的事情,使用相同的user32.dll函数和一个计时器,但是当我向上或向下滚动鼠标滚轮时,我可以编程一些事情会发生在Form的MouseDown事件。
Delta是MouseEventArgs上鼠标滚轮事件的值,但它不仅在鼠标滚轮向上或向下滚动时出现,而且还需要使用MouseEvent在该窗体上输入焦点。
我不想依赖任何表格。我不知道给GetKeyState或GetAsyncKeyState函数提供哪个整数来获取鼠标滚轮的状态,所以我可以在一个定时器频繁调用的函数中运行一段代码。
我该怎么办?它是哪个整数? user32或其他dll还有其他函数可以返回“Delta”吗? 如果我知道,我会很高兴,所以请回答! :d
答案 0 :(得分:2)
有一个非常好的CodePlex library可以让您轻松获得Global Mouse和KeyBoard事件。
以上链接描述:
此库允许您点击键盘和鼠标,即使应用程序处于非活动状态并在后台运行,也可以检测并记录其活动。
此库附加到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);
}
}
}
答案 1 :(得分:0)
您可以通过“添加引用”工具将以下文件添加到项目中:
Microsoft.DirectX.dll
和Microsoft.DirectX.DirectInput.dll
,然后在代码中添加两个命名空间:"使用Microsoft.DirectX;"和#34;使用Microsoft.DirectX.DirectInput;"。
可以在您的计算机中找到这些文件:
完成上述所有步骤后,您可以通过选择为其提供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版本下定位.NET框架,因为它不支持它。如果您忘记进行此更改,您将面临问题!