关于光标更改的通知
Notifications about cursor changes
是否可以获取鼠标光标变化的通知?我对在我的流程中引起的变化很感兴趣,但系统范围内的通知也一样好。由于我使用的是第三方库,因此可能有多种原因导致光标发生变化。
特别是,我想知道光标何时变为 IDC_HAND
。在线阅读,似乎没有通知驱动的方法。
我目前的解决方案是检查鼠标光标是否与LoadCursor(nullptr, IDC_HAND)
相同。然而:
- 这会导致资源泄漏吗?
LoadCursor
的 documentation 表示如果资源已经存在,则返回对所述资源的引用而不是新资源。因此看来我不应该尝试释放句柄。
- 因为
LoadCursor
会被调用很多次,所以经常执行此检查成本高吗?
- 我应该缓存
IDC_HAND
游标吗?如果我执行LoadCursor
时它不存在,当创建手形光标时,它是否必须具有相同的句柄?从我的测试来看,答案似乎是肯定的。
据我所知,理想的情况是有一条 Windows 消息指示游标更改,我可以在哪个阶段执行 LoadCursor
句柄检查。是否有其他选择?
感谢您的宝贵时间和协助。
回复晚了,抱歉。根据 Raymond Chen 的反馈(非常感谢)和他的 post,我只为 EVENT_OBJECT_NAMECHANGE
事件(当鼠标光标改变时触发)设置了一个钩子:
SetWinEventHook(EVENT_OBJECT_NAMECHANGE, EVENT_OBJECT_NAMECHANGE, nullptr, WinEventProc, GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_INCONTEXT);
并侦听 OBJID_CURSOR
对象 ID:
void CALLBACK WinEventProc(
HWINEVENTHOOK hWinEventHook,
DWORD event,
HWND hwnd,
LONG idObject,
LONG idChild,
DWORD dwEventThread,
DWORD dwmsEventTime
)
{
if (idObject == OBJID_CURSOR)
{
...
}
}
是否可以获取鼠标光标变化的通知?我对在我的流程中引起的变化很感兴趣,但系统范围内的通知也一样好。由于我使用的是第三方库,因此可能有多种原因导致光标发生变化。
特别是,我想知道光标何时变为 IDC_HAND
。在线阅读,似乎没有通知驱动的方法。
我目前的解决方案是检查鼠标光标是否与LoadCursor(nullptr, IDC_HAND)
相同。然而:
- 这会导致资源泄漏吗?
LoadCursor
的 documentation 表示如果资源已经存在,则返回对所述资源的引用而不是新资源。因此看来我不应该尝试释放句柄。 - 因为
LoadCursor
会被调用很多次,所以经常执行此检查成本高吗? - 我应该缓存
IDC_HAND
游标吗?如果我执行LoadCursor
时它不存在,当创建手形光标时,它是否必须具有相同的句柄?从我的测试来看,答案似乎是肯定的。
据我所知,理想的情况是有一条 Windows 消息指示游标更改,我可以在哪个阶段执行 LoadCursor
句柄检查。是否有其他选择?
感谢您的宝贵时间和协助。
回复晚了,抱歉。根据 Raymond Chen 的反馈(非常感谢)和他的 post,我只为 EVENT_OBJECT_NAMECHANGE
事件(当鼠标光标改变时触发)设置了一个钩子:
SetWinEventHook(EVENT_OBJECT_NAMECHANGE, EVENT_OBJECT_NAMECHANGE, nullptr, WinEventProc, GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_INCONTEXT);
并侦听 OBJID_CURSOR
对象 ID:
void CALLBACK WinEventProc(
HWINEVENTHOOK hWinEventHook,
DWORD event,
HWND hwnd,
LONG idObject,
LONG idChild,
DWORD dwEventThread,
DWORD dwmsEventTime
)
{
if (idObject == OBJID_CURSOR)
{
...
}
}