是否最好用同一个WinEventProc()回调函数注册多个SetWinEventHook()函数,并在函数的代码中单独处理每个事件类型,或者根据我的需要进行处理。
编辑:我发布了三种不同的场景,我想知道哪一种是最好的,为什么?
案例1:单个回调,单个委托,多个挂钩
static WinEventDelegate SingleCallbackDelegate = new WinEventDelegate(SingleCallback);
public static void SingleCallback(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
switch(evenType) :
case eventId1 : // do work related to event 1
case eventId2 : // do work related to event 2
// etc.
}
void SetHooks()
{
SetWinEventHook(eventId1, eventId1, IntPtr.Zero, SingleCallbackDelegate, 0,
0, flags);
SetWinEventHook(eventId2, eventId2, IntPtr.Zero, SingleCallbackDelegate, 0,
0, flags);
}
案例2:单个回调,多个委托,多个挂钩
static WinEventDelegate CallbackDelegate1 = new WinEventDelegate(SingleCallback);
static WinEventDelegate CallbackDelegate2 = new WinEventDelegate(SingleCallback);
public static void SingleCallback(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
switch(evenType) :
case eventId1 : // do work related to event 1
case eventId2 : // do work related to event 2
// etc.
}
void SetHooks()
{
SetWinEventHook(eventId1, eventId1, IntPtr.Zero, CallbackDelegate1, 0,
0, flags);
SetWinEventHook(eventId2, eventId2, IntPtr.Zero, CallbackDelegate2, 0,
0, flags);
}
案例3:多个回调,多个委托,多个挂钩
static WinEventDelegate CallbackDelegate1 = new WinEventDelegate(Callback1);
public static void Callback1(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
// do work related to event 1
}
static WinEventDelegate CallbackDelegate2 = new WinEventDelegate(Callback2);
public static void Callback1(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
// do work related to event 2
}
void SetHooks()
{
SetWinEventHook(eventId1, eventId1, IntPtr.Zero, CallbackDelegate1, 0,
0, flags);
SetWinEventHook(eventId2, eventId2, IntPtr.Zero, CallbackDelegate2, 0,
0, flags);
}
第二个片段没有意义,一个委托已经足够好了,可以传递给多个SetWinEventHook()调用。有可能指向第三个代码段,由于回调目标方法不相同,因此需要不同的委托对象。我能想到的唯一好处是,您可以减少该方法的强度,或者为特定进程或线程自定义回调行为。
重要的是要记住,SetWinEventHook()非常昂贵,在程序中进行回调会产生大量开销,这可能会对桌面上运行的其他进程的行为方式产生重大影响。你在回调中所做的任何需要时间的事情都会使其他进程也没有响应。因此,限制您进行的SetWinEventHook()调用的数量自动成为一个强大的优化目标。
您可以从函数的声明方式中看到这一点,它鼓励您使用小范围的eventMin和eventMax值。Windows可以使用一个简单的过滤器来确定是否不需要进行昂贵的回调。如果您的回调确实只对少数事件感兴趣,那么多次调用SetWinEventHook是有意义的。由于switch语句应该是次要的,所以您仍然应该使用第一个片段。