7

現在のマウスカーソルがアニメーション化されているかどうかを判断する方法はありますか?

少し前に現在のカーソルを保存する方法を探していました。自分の目的にぴったりのDrawIconEx関数を見つけました。残念ながら、現在のカーソルがアニメーション化されているかどうかを判断する方法がわかりません。静的カーソルの場合にistepIfAniCurパラメーターを1に設定すると、DrawIconExはFalseを返しますが、実際にはそのパラメーターを無視してTrueを返すため、静的カーソルとすべてのフレームを取得するためのループで使用できなくなります。アニメーション化されたもの。アニメーションの場合は期待どおりに機能するため、istepIfAniCurで範囲外になると、Falseが返されます。

では、HICON(HCURSOR)がアニメーションカーソルであることをどのように知ることができますか?DrawIconExは、カーソルがアニメーション化されているとどのように判断しますか?

どうもありがとう

4

3 に答える 3

7

1つの回避策を見つけました-UINTのDrawIconEx関数の最大値のistepIfAniCurパラメーターに渡します。誰かが4,294,967,295フレームのアニメーションカーソルを作成することは不可能です(おそらくカーソルムービーの場合は:)

この事実により、この値をDrawIconEx関数に渡すことができます。この関数は、カーソルがアニメーション化されている場合(フレーム範囲を超えているため)はFalseを返し、静的な場合はistepIfAniCurパラメーターを無視するためTrueを返します。何も描画する必要がないため、diFlagsパラメーターに0を渡す必要があります。

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 ...";


フレーム範囲を超えていることは、 DrawIconExが失敗したときにGetLastError関数を使用して検査できるOSエラーERROR_INVALID_PARAMETER によっても示されます。

于 2011-08-07T12:11:06.090 に答える
3

最良の方法:

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);
于 2017-03-02T21:23:30.130 に答える
0

これは、Delphiでの例(およびC ++への変換の試み)で、 GetIconInfo関数を使用してカーソルの寸法を取得しようとした方法ですが、期待どおりに機能しません。アニメーションカーソルの場合は常に1フレームの幅を返すため、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;

私のVisualC++の試み(私は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);
于 2011-08-07T14:23:51.107 に答える