OEM-Cursor sind gemeinsam genutzte Ressourcen, so dass alle Prozesse, die einen bestimmten Cursor anfordern, denselben Handle abrufen. Eine Anwendung kann Standard-System-Cursor-Handles beim Start zwischenspeichern, dann kann sie GetCursorInfo um den globalen Cursor-Handle zu erhalten und diesen Handle im Cache nachzuschlagen, um seine freundlich - wenn es sich um einen Systemcursor handelt.
Der folgende Delphi-Beispielcode demonstriert dies. Cursor-Handles werden in ein Array eingefügt, indem man LoadImage bei der Formularerstellung. Ein Timer fragt den globalen Cursor ab, indem er GetCursorInfo In regelmäßigen Abständen sucht der Code den Handle im Array, um den Namen des Cursors aus einem konstanten Array von Namen abzurufen:
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;
Beachten Sie, dass man bei der Verwendung von Delphi keine Cursor-Handles zwischenspeichern muss, da Delphi dies durch seine Bildschirm.Cursor Liste. Der Beispielcode verwendet sie nicht, um eine bessere Portabilität zu erreichen.
Beachten Sie auch, dass es kein 'OCR_HELP' in 'winuser.h' gibt, aber die bereitgestellte Konstante, die 'IDC_HELP' entspricht, scheint gut zu funktionieren (obwohl ich keinen Dialog in W7 finden konnte, der den "Help Select"-Cursor verwendet).