【发布时间】:2021-05-26 05:50:15
【问题描述】:
这是我遇到的问题:
-
我需要将光标切换到(比如说)
IDC_WAIT,直到我完成某些操作。 -
SetCursor只在鼠标移动前有效。 -
WM_SETCURSOR只有在鼠标移动后才有效。
您会认为我可以同时进行上述两种操作,同时调用SetCursor 并修改WM_SETCURSOR 的行为,这样我就可以让光标在未来某个时间点发生变化。
但我不能这样做。为什么?因为SetCursor 是应用程序范围的,但随机窗口不知道(也不应该)正确的光标是整个应用程序。它需要执行正确的命中测试以将WM_SETCURSOR 发送到实际位于光标下的窗口,目前还不清楚正确的方法是什么。
在 Win32 中切换和返回光标的正确方法是什么?我看到的每一个例子都是微不足道的,忽略了这些问题。
【问题讨论】:
-
应用程序范围是您想要的。使用GetCursor(),SetCursor(),挂起消息循环的慢东西,SetCursor()来恢复。如果缓慢的东西实际上没有挂起消息循环(不清楚),那么它会变得更加困难,因为所有子窗口都必须合作以保持沙漏。通常只在框架中实用,与 Winform 的 Control.UseWaitCursor 相比。
-
@HansPassant:即使我在应用程序范围内执行此操作,当我(比如说)调整边框大小或悬停在编辑框上时,光标仍然需要保持不受影响,否则会令人困惑。并且在操作仍在进行时,1像素的移动会突然引起变化根本没有意义,所以即使我愿意立即致电
SetCursor更改它,我仍然有这个问题应用程序-宽的。这里没有任何东西会挂起消息循环——这是主线程正在启动/停止的另一个线程上的后台操作——但是人们是如何做到这一点的呢? -
他们没有,弹出“正在处理它”对话框是标准方法。
-
@HansPassant:有趣的是,你提到了这一点,这正是我想要摆脱的,因为它对用户不友好并且没有必要阻止 UI 或弹出一个额外的窗口来显示我的身份正在做。所以真的没有好的解决办法吗? :(如果是这样,请随时将其发布为答案...
-
通过明显地禁用在工作线程被占用时无法安全使用的控件变得更加友好。就像启动它的按钮一样。
标签: c winapi mouse-cursor