【问题标题】:How to determine cursor visibility for a thread in Win32?如何确定 Win32 中线程的光标可见性?
【发布时间】:2019-12-22 02:17:40
【问题描述】:

每个线程都有自己的游标计数,通过 ShowCursor 调用递增/递减。 有没有办法查询该计数器以确定光标当前是否可见?

这种模式应该可以工作,但存在一些问题:

ShowCursor (FALSE);
bool visible = (ShowCursor (TRUE) >= 0);
  • Windows 应用兼容层可能会默默地不允许计数器降至 0 以下,因此第一次 ShowCursor 调用什么也不做,而第二次调用会破坏计数器。
  • 它有一些不必要的副作用,例如潜在的和不必要的光标隐藏/取消隐藏

【问题讨论】:

  • "Windows 应用程序兼容性层可能会默默地不允许计数器低于 0" - 自 negative values are valid 以来令人怀疑。 “不想要的副作用,例如潜在的和不必要的光标/取消隐藏” - 也许,但它可能太快而无法真正注意到。当然,总是有WM_SETREDRAWLockWindowUpdate()
  • “令人怀疑,因为负值是有效的。”是的,但是有些(旧)游戏由于某种原因,内置兼容层不允许隐藏光标。

标签: winapi


【解决方案1】:

您可以直接使用 GetCursorInfo() 测试光标可见性

bool IsCursorVisible()
{
    CURSORINFO ci = { sizeof(CURSORINFO) };
    if (GetCursorInfo(&ci))
        return ci.flags & CURSOR_SHOWING;
    return false;
}

我不确定这个调用失败意味着什么,所以我只是让它在失败时返回 false。

【讨论】:

  • 这甚至在ShowCursor() 文档中有所说明:“调用GetCursorInfo 来确定光标的可见性。
  • GetCursorInfo 返回“全局”光标的状态。这样,无论光标在屏幕上的哪个位置,您都可以获得它的状态。但是 ShowCursor 处理每个线程的计数,这会影响从特定线程创建的窗口。
  • 是的,但无论光标是否在屏幕上,最终都不是最重要的。每个线程的可见性计数是一个实现细节。我想我不明白你在做什么。
  • 无论如何,谢谢您的回复!我想我应该通过 GetCursorInfo 获取全局位置,然后确定光标是否在我的一个窗口上方(通过 WindowFromPoint)。如果是,那么我可以使用 GetCursorInfo 中的结果标志。
猜你喜欢
  • 1970-01-01
  • 2010-09-10
  • 2015-10-17
  • 2017-10-31
  • 2011-08-24
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2010-12-04
相关资源
最近更新 更多