7 votes

Comment puis-je déterminer si le curseur actuel de la souris est animé ?

Existe-t-il un moyen de déterminer si le curseur actuel de la souris est animé ?

Je cherchais un moyen comment sauvegarder le curseur actuel il y a quelque temps. J'ai trouvé le DrawIconEx qui convient parfaitement à mon objectif. Malheureusement, je ne sais pas comment déterminer si le curseur actuel est animé. J'espérais que si je fixais le paramètre istepIfAniCur à 1 en cas de curseur statique DrawIconEx renvoie False mais il ignore vraiment ce paramètre et renvoie True ce qui m'empêche de l'utiliser dans la boucle pour récupérer le curseur statique ainsi que toutes les images du curseur animé. Dans le cas de l'animé, cela fonctionne comme prévu et lorsque vous sortez de la plage avec istepIfAniCur, il renvoie False.

Comment puis-je savoir que HICON (HCURSOR) est le curseur animé ? Comment le DrawIconEx déterminer que le curseur est animé ?

Merci beaucoup.

7voto

J'ai trouvé une solution de contournement - passer au paramètre istepIfAniCur de la méthode d'évaluation de la qualité de l'eau. DrawIconEx valeur maximale de la fonction UINT . Il est impossible que quelqu'un crée un curseur animé avec 4,294,967,295 frames (possible peut-être pour un film de curseur :)

Grâce à ce fait, vous pouvez transmettre cette valeur à la fonction DrawIconEx qui retournera False dans le cas où le curseur est animé (parce qu'il dépasse la plage de trames) et True dans le cas d'un curseur statique, car elle ignore le paramètre istepIfAniCur. Vous devez passer 0 au paramètre diFlags car il n'y a pas besoin de dessiner quoi que ce soit.

Voici l'exemple en 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 ...';

Et parce que j'ai promis le tag C++, voici ma tentative de traduction.

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

Le dépassement de la plage de trame est également indiqué par l'erreur OS ERREUR_PARAMÈTRE INVALIDE ce que vous pouvez inspecter en utilisant GetLastError lorsque la fonction DrawIconEx échoue.

3voto

user2558526 Points 31

Le meilleur moyen :

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);

0voto

Voici l'exemple en Delphi (et la tentative de traduction en C++) comment j'essayais d'obtenir les dimensions du curseur en utilisant GetIconInfo mais cela ne fonctionne pas comme je l'avais prévu. Elle renvoie toujours la largeur d'une image dans le cas d'un curseur animé, il semble donc que la fonction GetIconInfo ne s'occupe pas du tout des cadres. Ou est-ce que je me trompe ?

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;

Ma tentative de Visual C++ (notez que je ne connais pas le C++ et que je n'ai pas de compilateur :)

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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X