Les curseurs OEM étant des ressources partagées, tous les processus demandant un curseur spécifique récupèrent le même handle. Une application peut mettre en cache les poignées de curseur système standard au démarrage, puis utiliser GetCursorInfo pour obtenir le handle de curseur global et rechercher ce handle dans le cache pour récupérer son kind - s'il s'agit d'un curseur système.
L'exemple de code Delphi ci-dessous illustre. Les poignées de curseur sont remplies dans un tableau en utilisant LoadImage lors de la création du formulaire. Un scrutin de minuterie, le curseur global en utilisant GetCursorInfo à intervalles réguliers, le code semble-la poignée dans le tableau pour récupérer le nom du curseur à partir d'une constante tableau de noms:
const
HighCursor = 13;
type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
FCursorHandles: array [0..HighCursor] of HCURSOR;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
OEMCursors: array [0..HighCursor] of Integer = (OCR_NORMAL, OCR_IBEAM,
OCR_WAIT, OCR_CROSS, OCR_UP, OCR_SIZENWSE, OCR_SIZENESW, OCR_SIZEWE,
OCR_SIZENS, OCR_SIZEALL, OCR_NO, OCR_HAND, OCR_APPSTARTING,
32651 {OCR_HELP?});
CursorNames: array [0..HighCursor] of string = ('OCR_NORMAL', 'OCR_IBEAM',
'OCR_WAIT', 'OCR_CROSS', 'OCR_UP', 'OCR_SIZENWSE', 'OCR_SIZENESW',
'OCR_SIZEWE', 'OCR_SIZENS', 'OCR_SIZEALL', 'OCR_NO', 'OCR_HAND',
'OCR_APPSTARTING', 'OCR_HELP');
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i := 0 to HighCursor do
FCursorHandles[i] := LoadImage(0, MakeIntResource(OEMCursors[i]),
IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR or LR_DEFAULTSIZE or LR_SHARED);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
function GetCursorName(Cursor: HCURSOR): string;
var
i: Integer;
begin
for i := 0 to HighCursor do
if Cursor = FCursorHandles[i] then begin
Result := CursorNames[i];
Exit;
end;
Result := 'Unknown Cursor'; // A custom cursor.
end;
var
CursorInfo: TCursorInfo;
begin
CursorInfo.cbSize := SizeOf(CursorInfo);
if GetCursorInfo(CursorInfo) then
Label1.Caption := GetCursorName(CursorInfo.hCursor)
else
Label1.Caption := 'Fail: ' + SysErrorMessage(GetLastError);
end;
Notez que lorsque vous utilisez un Delphi ne avoir à mettre en cache les poignées de curseur, puisque Delphi le fait à travers sa liste Screen.Cursors. L'exemple de code ne l'utilise pas pour avoir une meilleure portabilité.
Notez également qu'il n'y a pas de 'OCR_HELP' dans 'winuser.h', mais la constante fournie correspondant à 'IDC_HELP' semble fonctionner correctement (bien que je n'ai pas trouvé de dialogue dans W7 qui utilise le Sélectionnez "curseur".
Semble comme son impossible :( – Alex
TNX pour répondre à votre question 3 ans plus tard - vraiment m'a aidé :) – barakcaf