c++ - 关于光标更改的通知

标签 c++ winapi mouse-cursor

是否可以获取鼠标光标更改的通知?我对在我的流程中引起的变化很感兴趣,但系统范围内的通知也一样好。由于我使用的是第三方库,因此可能有多种原因导致光标发生变化。

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

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

  • 这会导致资源泄漏吗? documentation for LoadCursor 表示如果资源已经存在,则返回对所述资源的引用而不是新资源。因此,我似乎不应该尝试释放 handle 。
  • 由于 LoadCursor 会被多次调用,因此经常执行此检查的成本是否很高?
  • 我应该缓存 IDC_HAND 游标吗?如果我执行LoadCursor时它不存在,那么当创建手形光标时,它是否必须具有相同的句柄?从我的测试来看,答案似乎是肯定的。

据我所知,理想的情况是有一条 Windows 消息指示光标更改,我可以在哪个阶段执行 LoadCursor 句柄检查。是否有其他选择?

感谢您的时间和帮助。

最佳答案

回复晚了,抱歉。基于 Raymond Chen 的反馈(非常感谢)和他的 post ,我只为 EVENT_OBJECT_NAMECHANGE 事件设置了一个 Hook (当鼠标光标改变时触发):

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)
  {
    ...
  }
}

关于c++ - 关于光标更改的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28917667/

相关文章:

c++ - 从暴露类返回提升列表

c++ - boost::asio::steady_timer 在 boost::dll 中不起作用

c++ - NetUIHWND 和 DirectUIHWND

c# - 在 XNA/C# 中添加自定义光标?

C++类和继承错误: undefined reference to derived class

c++ - 将迭代器设置为具有最高键的值

c# - 需要使用 win32 api 在 c# 中复制文件 - 我该怎么做?

java - 使用 Java 在 Windows 中截取前台应用程序屏幕截图,无需额外的边缘

c# - Cursor.Current 与 this.Cursor

javascript - 跨浏览器 GRAB 游标(-moz、-webkit)