【问题标题】:WinAPI SetSystemCursor and LoadCursorFrom - how to set default cursor?WinAPI SetSystemCursor 和 LoadCursorFrom - 如何设置默认光标?
【发布时间】:2014-11-24 19:41:55
【问题描述】:

我通过以下方式设置自己的光标:

HCURSOR hCurStandard =  LoadCursorFromFile(TEXT("cursor.cur"));
SetSystemCursor(hCurStandard, 32512);
DestroyCursor(hCurStandard);

如何返回并设置默认光标?

这不起作用:

SetSystemCursor(LoadCursor(0, IDC_ARROW), 32512);

----编辑-----

HCURSOR hcursor = LoadCursor(0, IDC_ARROW);
HCURSOR hcursor_copy = CopyCursor(hcursor);
BOOL ret = SetSystemCursor(hcursor_copy, OCR_NORMAL);
DestroyCursor(hcursor);

这适用于除 IDC_ARROW 之外的所有游标,这是什么...?

【问题讨论】:

  • 你检查SetSystemCursor的返回值了吗?如果为 0,请致电GetLastError 看看错误是什么。
  • SetSytemCursor 返回 1 但没有任何变化
  • 好的。文档说你不应该使用LoadCursor 来调用SetSystemCursor 见这里:msdn.microsoft.com/en-us/library/windows/desktop/… 所以下面的答案可能是你需要做的。
  • 没错,我编辑了我的帖子,但仍有一些奇怪的问题。

标签: c++ winapi cursor


【解决方案1】:

问题是您可能使用 SetSystemCursor 函数来更改标准箭头光标。此函数实际上用您提供的 HCURSOR 覆盖系统光标,因此当您使用 IDC_ARROW 调用 LoadCursor 时,它会加载您的自定义光标。这解释了你的程序的奇怪行为。为避免这种情况,您应该在更改之前保存默认系统光标。

HCURSOR def_arrow_cur = CopyCursor(LoadCursor(0, IDC_ARROW));
//now you have a copy of the original cursor
SetSystemCursor(LoadCursorFromFile("my_awesome_cursor.cur"),OCR_NORMAL);
...
SetSystemCursor(def_arrow_cur,OCR_NORMAL);//restore the good old arrow

我知道这是一个迟到的答案,但我希望有人会觉得这很有用。

【讨论】:

    【解决方案2】:

    根据SetSystemCursor 文档:

    要指定从资源加载的游标,请使用 CopyCursor 函数,然后将副本传递给 SetSystemCursor。

    这样做可能会解决您原来的问题:

    HCURSOR hCurDef = CopyCursor(LoadCursor(0, IDC_ARROW));
    SetSystemCursor(hCurDef, OCR_NORMAL);
    DestroyCursor(hCurDef);
    

    如果这不起作用,您可以存储现有光标的文件名,您可以通过读取注册表获得该文件名 (HKEY_CURRENT_USER\Control Panel\Cursors\Arrow),或者作为快捷方式使用 GetProfileString:

    TCHAR chCursorFile[MAX_PATH];
    GetProfileString(TEXT("Cursors"), TEXT("Arrow"), TEXT(""), chCursorFile, MAX_PATH);
    

    要恢复光标,请使用LoadCursorFromFile 加载前一个光标并使用SetSystemCursor 设置它。

    请注意,调用 SetSystemCursor 不会更新注册表,因此您的自定义光标将无法在重新启动后继续存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-20
      • 2012-01-17
      • 2017-07-25
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多