有关游标更改的通知

时间:2015-03-07 17:17:50

标签: c++ winapi mouse-cursor

是否可以获得鼠标光标更改的通知?我对我的流程中发生的变化感兴趣,但系统范围的通知也同样好。由于我使用的是第三方库,因此光标可能有多种原因需要更改。

特别是,我想知道光标何时变为IDC_HAND。在线阅读,似乎并不是一种通知驱动的方法。

我目前的解决方案是检查鼠标光标是否与LoadCursor(nullptr, IDC_HAND)相同。但是:

  • 这会导致资源泄漏吗? LoadCursor的{​​{3}}表示如果资源已经存在,则返回对所述资源的引用而不是新资源。因此,我似乎不应该试图释放句柄。
  • 经常执行此检查是否代价高昂,因为LoadCursor会被多次调用?
  • 我应该缓存IDC_HAND光标吗?如果在执行LoadCursor时它不存在,则在创建手形光标时,它是否必须具有相同的句柄?根据我的测试,答案似乎是肯定的。

据我所知,理想情况是有一条Windows消息指示游标在我可以执行LoadCursor句柄检查的阶段发生变化。是否有替代方案?

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:0)

迟到的回复,道歉。根据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)
  {
    ...
  }
}