- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
是否最好使用相同的 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() 调用的次数自动成为一个强大的优化目标。
您可以在声明函数的方式中看到这一点,它鼓励您使用小范围的 eventMin 和 eventMax 值。一个简单的过滤器,Windows 可以使用它来确定不需要进行昂贵的回调。如果您的回调确实只对少数事件感兴趣,那么多次调用 SetWinEventHook 确实有意义。您仍然会坚持使用第一个代码段,因为 switch 语句应该是次要的。
关于c# - WinProcEvent 一个或多个 SetWinEventHook 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22067579/
我目前正在开发一个程序,该程序使用的功能应该在其他进程的窗口最大化/最大化时提醒我。对于最大化事件,我的意思是按下右上角关闭按钮旁边的符号。 为此,我使用了 SetWinEventHook功能。问题是
我正在使用 SetWinEventHook Hook 来检测编辑控件的选择。在事件钩子(Hook)回调函数中,有没有办法指定自定义数据?在我的例子中,自定义数据将是 VKeyboard 实例。 请查看
这是这个问题的后续:Alt Tab overlay Win32 identificator . 我尝试使用 Winuser API 中的 SetWinEventHook 函数捕捉 alt-tab 切换
我正在尝试调用SetWinEventHook如上所述here for C#但是来自nodejs。 我正在使用ffi-napi绑定(bind)到该函数。到目前为止,这是我的代码: const ffi =
我一直在做一个需要检测当前事件窗口并连续获取事件窗口标题的项目。谁能解释一下如何使用 SetWinEventHook() 函数获取 Active Window changed 消息。[ 我使用带有计时
我编写了一些代码来监 window 口标题的更改。它在我的 Windows 7 中的不同窗口中运行良好。我像这样使用 SetWinEventHook: SetWinEventHook(EVENT_OB
我在进程上创建了一个 Hook ,以便在其窗口移动时进行注册。我使用事件常量 EVENT_OBJECT_LOCATIONCHANGE,根据 MSDN An object has changed loc
我想用 SetWinEventHook 设置一些事件并等待。在五个事件之后,我想退出消息循环。问题是代码卡在 getMessage 中而没有进入循环。每当事件发生时,都会正确调用回调函数。 HWINE
是否最好使用相同的 WinEventProc() 回调函数注册多个 SetWinEventHook() 函数,并在函数代码中单独处理每个事件类型,或者根据需要处理多个事件类型。 编辑:我发布了三个不同
我正在使用 CreateProcess 打开一个窗口,但我在理解 SetWinEventHook 时遇到了很多麻烦。 在调用函数中,我有: HWINEVENTHOOK hook = SetWinEve
对于我正在制作的应用程序,我想拦截来自外部进程的窗口消息(很像 spy++ 的做法)。我发现我可以使用 SetWinEventHook 来做到这一点。这是我的代码。 class Program
我想获取从特定应用程序弹出的每个新对话框的句柄。 我知道我应该设置一个钩子(Hook) SetWinEventHook它在 Windows 中的 user32.dll 中,但我不知道如何在 pytho
我是一名优秀的程序员,十分优秀!