Delphi:Screen.Cursor 不工作,无法弄清楚 Windows.SetCursor(crHourGlass)

Ric*_*olf 4 delphi

在我的应用程序中,我有

Screen.Cursor := crHourGlass;
Application.ProcessMessages;
try
...

finally
  Screen.Cursor := crDefault;
  Application.ProcessMessages;
end;
Run Code Online (Sandbox Code Playgroud)

但这根本没有按预期工作。它似乎在处理时立即变回 crDefault。

经过一番谷歌搜索后,我决定尝试 Windows.SetCursor() - 但我已经搜索了 MSDN,但找不到光标类型列表。

更新 我以为我找到了解决方案(使用 SetSystemCursor(Screen.Cursors[crHourGlass], OCR_NORMAL);)但我似乎无法将光标更改回正常:(。

Ric*_*olf 5

我想我有解决方案:

以下是如何更改“整个桌面”的光标 - 不仅仅是针对您的应用程序:

SetSystemCursor(Screen.Cursors[crDefault], OCR_NORMAL);
Run Code Online (Sandbox Code Playgroud)

但请注意:任何其他想要更改光标的应用程序/窗口都会这样做 - 因此,只有当您的应用程序忙碌时,您的用户不会与其他应用程序混在一起,这才有效。作为替代,您可以暂时将所有系统默认光标更改为您想要的光标 - 并在此过程后将它们全部更改回来。

我仍然对 MSDN 没有为 SetCursor 提供其游标类型感到失望 - 但幸运的是我最终没有使用它。

更新: 这似乎是正确的轨道,但我似乎无法在 SetSystemCursor(Screen.Cursors[crHourGlass], OCR_NORMAL); 之后将光标改回来。如果有人正在阅读本文,如果您能花点时间向我提供一些工作代码,我将不胜感激 - 1. 将系统光标设置为沙漏,然后返回到箭头。

编辑:恢复到默认光标的示例代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  cArrow, cHour: HCURSOR;
begin
  cArrow := CopyImage(Screen.Cursors[crArrow], IMAGE_CURSOR, 0, 0, LR_COPYFROMRESOURCE);
  cHour := CopyImage(Screen.Cursors[crHourGlass], IMAGE_CURSOR, 0, 0, LR_COPYFROMRESOURCE);
  if (cArrow <> 0) and (cHour <> 0) and SetSystemCursor(cHour, OCR_NORMAL) then
    try

      // do processing

    finally
      SetSystemCursor(cArrow, OCR_NORMAL);
    end;
end;
Run Code Online (Sandbox Code Playgroud)

  • MSDN 不会在`SetCursor` 中提及游标类型,因为`SetCursor` 不*接受* 游标类型。它需要一个游标*句柄*,因此它指的是可以为您提供其中之一的各种函数,包括“CreateCursor”和“LoadCursor”。后者*确实*提到了各种内置游标。如果这足够了,您可以按照 MSDN 中的其他链接访问游标的主题概述。 (3认同)