WinProcEvent一个或多个SetWinEventHook回调?

时间:2014-02-27 11:47:02

标签: c# .net windows event-handling ui-automation

是否最好使用相同的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);
}

1 个答案:

答案 0 :(得分:2)

第二个片段没有任何意义,单个委托已经足够好,可以传递给多个SetWinEventHook()调用。 可能指向第三个片段的点,因为回调目标方法不相同,所以需要不同的委托对象。我能想到的唯一好处是你可以使方法不那么强大或者为特定进程或线程定制回调的行为。

重要的是要记住,SetWinEventHook()非常昂贵,将回调引入程序会产生大量开销,这会对其他进程产生重大影响在桌面上运行的行为。你在回调中做的任何事都需要时间,这也会使其他进程无法响应。因此,限制您进行的SetWinEventHook()调用的数量自动成为强大的优化目标。

您可以通过声明函数的方式看到这一点,它鼓励您使用一小部分 eventMin eventMax 值。一个简单的过滤器,Windows可以用来确定进行昂贵的回调是不必要的。如果您的回调确实只对少数事件感兴趣,那么多次调用SetWinEventHook 是有意义的。你仍然坚持使用第一个片段,因为switch语句应该是次要的。