Con trỏ OEM là tài nguyên được chia sẻ, vì vậy tất cả quy trình yêu cầu một con trỏ cụ thể sẽ truy xuất cùng một điều khiển. Một ứng dụng có thể lưu cache xử lý con trỏ hệ thống chuẩn khi khởi động, sau đó nó có thể sử dụng GetCursorInfo để xử lý con trỏ toàn cục và tra cứu bộ xử lý này trong bộ nhớ cache để truy xuất loại - nếu nó là con trỏ hệ thống.
Mã mẫu dưới Delphi minh họa. Con trỏ con trỏ được điền vào một mảng bằng cách sử dụng LoadImage khi tạo biểu mẫu. Một giờ các cuộc thăm dò con trỏ toàn cầu bằng cách sử dụng GetCursorInfo đều đặn, các mã trông lên tay cầm trong mảng để lấy tên của con trỏ từ một mảng liên tục của tên:
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;
Lưu ý rằng khi sử dụng Delphi một không có bộ nhớ cache xử lý con trỏ, kể từ Delphi hiện nó thông qua danh sách Screen.Cursors của nó. Mã mẫu không sử dụng nó để có tính di động tốt hơn. Cũng cần lưu ý rằng không có 'OCR_HELP' trong 'winuser.h', nhưng hằng số được cung cấp tương ứng với 'IDC_HELP' có vẻ hoạt động tốt (mặc dù tôi không thể tìm thấy hộp thoại trong W7 sử dụng "Trợ giúp Chọn "con trỏ".
Có vẻ như không có thể của nó :( – Alex
tnx để trả lời câu hỏi của bạn 3 năm sau - thực sự đã giúp tôi :) – barakcaf