如何确定当前鼠标光标是否已设置动画?

时间:2011-08-06 23:59:26

标签: c++ delphi winapi animated mouse-cursor

有没有办法确定当前鼠标光标是否有动画?

前段时间我正在寻找一种方式how to save the current cursor。我找到了DrawIconEx函数,它非常适合我的目的。不幸的是,我不知道如何确定当前光标是否已设置动画。我希望如果我在静态游标DrawIconEx的情况下将istepIfAniCur参数设置为1,则返回False,但它确实忽略了该参数并返回True,不允许我在循环中使用它来获取静态游标以及来自动画的所有帧。如果动画效果正常,那么当你使用istepIfAniCur超出范围时,它会返回False。

那我怎么知道HICON(HCURSOR)是动画光标? DrawIconEx如何确定光标是否已设置动画?

非常感谢

3 个答案:

答案 0 :(得分:7)

我找到了一个解决方法 - 传递给DrawIconEx函数最大值UINT的istepIfAniCur参数。有人不可能用4,294,967,295帧创建动画光标(可能是某些光标电影:)左右

有了这个事实,你可以将这个值传递给DrawIconEx函数,当光标被动画化时(由于超出帧范围)将返回False,而如果是静态的则返回True,因为它忽略了istepIfAniCur参数。你应该将0传递给diFlags参数,因为不需要绘制任何东西。

以下是Delphi示例:

if not DrawIconEx(Canvas.Handle, 0, 0, hCursor, 0, 0, High(Cardinal), 0, 0) then
  Caption := 'Cursor is animated ...'
else
  Caption := 'Cursor is not animated ...';

因为我承诺C ++标签是我的翻译尝试

if (!DrawIconEx(this->Canvas->Handle, 0, 0, hCursor, 0, 0, UINT_MAX, NULL, 0))
  this->Caption = "Cursor is animated ...";
else
  this->Caption = "Cursor is not animated ...";


超出帧范围也由操作系统错误ERROR_INVALID_PARAMETER指示,当GetLastError失败时,您可以使用DrawIconEx函数检查该错误。

答案 1 :(得分:2)

最佳方式:

      typedef HCURSOR(WINAPI* GET_CURSOR_FRAME_INFO)(HCURSOR, LPCWSTR, DWORD, DWORD*, DWORD*);
      GET_CURSOR_FRAME_INFO fnGetCursorFrameInfo = 0;

      HMODULE libUser32 = LoadLibraryA("user32.dll");
      if (!libUser32)
      {
        return false;
      }

      fnGetCursorFrameInfo = reinterpret_cast<GET_CURSOR_FRAME_INFO>(GetProcAddress(libUser32, "GetCursorFrameInfo"));
      if (!fnGetCursorFrameInfo)
      {
        return false;
      }

      DWORD displayRate, totalFrames;
      fnGetCursorFrameInfo(hcursor, L"", 0, &displayRate, &totalFrames);

答案 2 :(得分:0)

以下是Delphi中的示例(并尝试转换为C ++)我是如何尝试使用GetIconInfo函数获取游标尺寸的,但它并不像我预期的那样工作。在动画光标的情况下,它总是返回一帧的宽度,因此似乎GetIconInfo根本不处理帧。或者我错了吗?

procedure TForm1.Timer1Timer(Sender: TObject);
var
  IconInfo: TIconInfo;
  CursorInfo: TCursorInfo;
  Bitmap: Windows.TBitmap;
begin
  CursorInfo.cbSize := SizeOf(CursorInfo);
  GetCursorInfo(CursorInfo);
  GetIconInfo(CursorInfo.hCursor, IconInfo);

  if GetObject(IconInfo.hbmColor, SizeOf(Bitmap), @Bitmap) <> 0 then
  begin
    Caption := 'Cursor size: ' +
               IntToStr(Bitmap.bmWidth) + ' x ' +
               IntToStr(Bitmap.bmHeight) + ' px';
  end;

  DeleteObject(IconInfo.hbmColor);
  DeleteObject(IconInfo.hbmMask);
end;

我的Visual C ++尝试(注意我不知道C ++并且没有编译器:)

CString txt;
ICONINFO ii;
CURSORINFO ci;
BITMAP bitmap;

ci.cbSize = SizeOf(CURSORINFO);
GetCursorInfo(ci);
GetIconInfo(ci.hCursor, ii);
GetObject(ii.hbmColor, sizeof(BITMAP), &bitmap);
txt.Format("Cursor width: %d px", bitmap.bmWidth);
MessageBox(txt);