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