gpt4 book ai didi

c# - WinProcEvent 一个或多个 SetWinEventHook 回调?

转载 作者:可可西里 更新时间:2023-11-01 11:53:56 31 4
gpt4 key购买 nike

是否最好使用相同的 WinEventProc() 回调函数注册多个 SetWinEventHook() 函数,并在函数代码中单独处理每个事件类型,或者根据需要处理多个事件类型。

编辑:我发布了三个不同的场景,我想知道哪一个是最好的,为什么?

案例 1:单个回调、单个委托(delegate)、多个 Hook

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:单个回调,多个委托(delegate),多个钩子(Hook)

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:多个回调,多个委托(delegate),多个钩子(Hook)

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);
}

最佳答案

第二个代码段没有意义,单个委托(delegate)已经足以传递给多个 SetWinEventHook() 调用。 可能指向第三个片段,因为回调目标方法不相同,所以需要不同的委托(delegate)对象。我能想到的唯一好处是您可以使该方法不那么复杂或为特定进程或线程自定义回调的行为。

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

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

关于c# - WinProcEvent 一个或多个 SetWinEventHook 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22067579/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com