【问题标题】:Set custom cursor, system wide, for all cursor IDs为所有光标 ID 设置系统范围的自定义光标
【发布时间】:2014-07-01 21:51:25
【问题描述】:

这是我正在使用的代码:

HCURSOR hCrossHair;

...

hCrossHair = LoadCursorFromFile( "ColorTool_CrossHair.cur" );

...

SetSystemCursor( hCrossHair, OCR_NORMAL );

有没有办法设置光标使其覆盖所有其他光标?例如,如果我在SetSystemCursor 中指定OCR_NORMAL,那么它只会替换通用箭头(默认)光标,但只要鼠标悬停在某处的文本字段或可调整大小的窗口的边缘等,它在这些情况下更改为通常的光标。

我也试过

SetSystemCursor( hCrossHair, OCR_NORMAL );
SetSystemCursor( hCrossHair, OCR_IBEAM );
SetSystemCursor( hCrossHair, OCR_SIZE );

但似乎只有一个调用(通常是第一个调用)会被应用。

感谢您的建议。

【问题讨论】:

    标签: c++ windows winapi c++builder


    【解决方案1】:

    Read the documentation:

    将id参数指定的系统游标内容替换为hcur参数指定的游标内容,然后销毁hcur。

    这意味着每次您想调用 SetSystemCursor() 时都必须重新加载或复制光标。

    另外请记住,这只会替换 system 游标,而不是在应用启动后手动分配给 VCL 的 TScreen::Cursors[] 属性的用户定义游标。

    【讨论】:

    • 谢谢。我知道文档。我正在寻找一种在所有上下文中强制使用自定义光标的方法 - 箭头,ibeam,一切。我以前见过的一个例子是 Microsoft Frontpage 2003 的颜色选择器的屏幕上任意位置的选择,它将光标锁定在滴管中。
    • 那你就错了。此类应用程序只需为此使用SetCursor()SetCapture()。捕获鼠标时,其他应用程序不会收到 WM_SETCURSOR 消息来更改光标。详情见这篇文章:Using SetCapture() and ReleaseCapture() correctly (usually during a drag n' drop operation)。它提到这种技术就是 Spy++ 在将鼠标移动到其他应用程序上时如何实现其十字光标,就像 Frontpage 的滴管一样。
    • 雷米,一如既往,你是完全正确的。再次感谢。签名,一个长期的 C++ Builder 用户,自从 news://forums.borland.com 和 BCB4/5 天以来一直听取您的建议。
    • SetCapture() 返回捕获鼠标时之前捕获鼠标的窗口的HWND。所以 NULL 意味着没有以前的捕获窗口。但是,如果您的应用在将鼠标移出您传递给SetCapture() 的窗口时收到鼠标消息(WM_MOUSEMOVE 等),您就会知道捕获是否成功。
    • 我对它进行了测试,它对我来说效果很好 - 但仅在调用 SetCapture()SetCursor() 以响应鼠标按下事件时。只要按住鼠标,光标在屏幕上移动到其他应用程序上时就不会改变。一旦释放鼠标,或者焦点从窗口移开,捕捉就会自动释放并且光标会重置。这是有道理的,因为鼠标捕获最初是为支持拖放操作而设计的。
    猜你喜欢
    • 2023-03-25
    • 2014-06-04
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    相关资源
    最近更新 更多