当前,要定义事件挂钩,我正在写:
delegate void WinEventHookDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);
...
private WinEventHookDelegate WindowEventHookInstance;
...
private void WindowEventHook(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
...
WindowEventHookInstance = new WinEventHookDelegate(WindowEventHook);
Install();
...
SetWinEventHook(...
WindowEventHookInstance, // lpfnWinEventProc
...);
...
即我正在创建3个名称(WinEventHookDelegate
,WindowEventHookInstance
,WindowEventHook
),2个重复的原型声明和1个赋值,以仅获得指向函数的指针。
我可以写成更少冗余,更短的文字吗?也许是一行吗?
答案 0 :(得分:0)
您可以使用C#的委托来代替定义自己的委托。
对于指向无效函数的委托(例如您的案例),可以使用Action。
您可以像这样直接将其粘贴在SetWinEventHook方法中,而不是声明和实例化委托(或在这种情况下为Action委托)。 编译器将负责实例化。
public void SetWinEventHook(Action<IntPtr, uint, IntPtr, int, int, uint, uint> myDelegate)
{
}
现在为了启动您的代表指向您的功能,请执行此操作
myDelegate()
但是,问题是此委托需要您声明它将需要的7个参数。
为了提供这些信息,您可以像下面这样在SetWinEventHook方法中将它们作为第二个参数传递
public void SetWinEventHook(Action<IntPtr, uint, IntPtr, int, int, uint, uint> myDelegate, IntPtr a, uint b, IntPtr c, int d, int e, uint f, uint g)
{
myDelegate(a,b,c,d,e,f,g);
}
所以在这一点上您基本上是
1)宣布一名代表
2)实例化一个代表
3)创建了一个钩子方法来启动委托/功能
现在,您所需要做的就是调用SetWinEventHook并传入lambda或传入其他地方编写的函数,以便您的委托人指向它。
SetWinEventHook((a, b, c, d, r, f, g) => // using lambda here
{
},
new IntPtr(), 1, new IntPtr(), 2,3,4,5
);