我有这个来自NuGet包的课程:
using System.Windows.Forms;
namespace FMUtils.KeyboardHook
{
public class KeyboardHookEventArgs
{
public bool isRShiftPressed { get; }
public bool isRWinPressed { get; }
public bool isShiftPressed { get; }
public bool isWinPressed { get; }
public Keys Key { get; }
public override string ToString();
}
}
在一个程序集中,然后由此引用:
using System;
using System.Windows.Forms;
using FMUtils.KeyboardHook;
namespace SpeedyGonzales
{
public class MyClass
{
public MyClass()
{
var key = new KeyboardHookEventArgs();
}
}
}
这在编译时中断,给我这个错误:
' KeyboardHookEventArgs'不包含0的构造函数 参数
现在我发现了一些关于这个问题的事情:
这似乎是我的情况,但由于我的类不继承任何东西,这意味着唯一的直接父级是..对象?对象没有无参数构造函数吗?请澄清。
答案 0 :(得分:3)
问题中显示的源代码与source in the NuGet package不符。 KeyboardHookEventArgs
类实际上包含一个带参数的构造函数。此构造函数的签名如下所示:
internal KeyboardHookEventArgs(FMUtils.KeyboardHook.Hook.KBDLLHOOKSTRUCT lParam)
构造函数标记为internal
,即它在包含声明的程序集之外是不可见的(这就是为什么你可能在Visual Studio中没有看到它)。因此,您无法直接在代码中创建KeyboardHookEventArgs
类型的对象。这可能是该库的作者所希望的(因为他明确地声明了构造函数内部)。
intended usage是使用Hook
类来创建钩子。如您所见,类型KeyboardHookEventArgs
的对象随后由Hook
类创建,并作为事件处理程序的参数传递给您的代码:
var KeyboardHook = new Hook("Global Action Hook");
KeyboardHook.KeyDownEvent += KeyDown;
// Also: KeyboardHook.KeyUpEvent += KeyUp;
private void KeyDown(KeyboardHookEventArgs e)
{
// handle keydown event here
// Such as by checking if e (KeyboardHookEventArgs) matches the key you're interested in
if (e.Key == Keys.F12 && e.isCtrlPressed)
{
// Do your magic...
}
}