I cursori OEM sono risorse condivise, quindi tutti i processi che richiedono un cursore specifico recupereranno lo stesso handle. Un'applicazione può memorizzare nella cache gli handle del cursore di sistema standard all'avvio, quindi può utilizzare per ottenere l'handle globale del cursore e cercare questo handle nella cache per recuperare il suo tipo - se è di un cursore di sistema.
Il seguente codice di esempio Delphi dimostra. Le maniglie del cursore vengono popolate su un array utilizzando LoadImage alla creazione del modulo. Un timer sondaggi il cursore globale utilizzando GetCursorInfo a intervalli regolari, il codice è-la maniglia nella matrice per recuperare il nome del cursore da una matrice costante di nomi:
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;
Si noti che quando si utilizza Delphi uno non lo fa devono memorizzare gli handle del cursore nella cache, poiché Delphi lo fa attraverso la sua lista Screen.Cursors. Il codice di esempio non lo usa per avere una portabilità migliore.
Inoltre, non c'è "OCR_HELP" in "winuser.h", ma la costante fornita corrispondente a "IDC_HELP" sembra funzionare correttamente (sebbene non sia stato possibile trovare una finestra di dialogo in W7 che faccia uso della "Guida Seleziona "cursore".
sembrare la sua non è possibile :( – Alex
tnx per rispondere alla tua domanda 3 anni più tardi - davvero mi ha aiutato :) – barakcaf