Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Получить дескриптор текущего курсора

01.01.2007
{ 
 
The GetCursor() API is limited in that it does not, by default, return a handle to the current
  cursor
when that cursor is owned by another thread. This article demonstrates a way to retrieve
  the current cursor regardless of what thread owns it
.
 
For example, when you wish to include the image of the cursor in a screen capture.
}
 
 
 
function GetCursorHandle: HCURSOR;
 
var
   hWindow
: HWND;
   pt
: TPoint;
   pIconInfo
: TIconInfo;
   dwThreadID
, dwCurrentThreadID: DWORD;
 
begin
   
// Find out which window owns the cursor
 
// Das zum Mauszeiger zugehцrige Fenster finden
 
GetCursorPos(pt);
   hWindow
:= WindowFromPoint(pt);
 
   
// Get the thread ID for the cursor owner.
 
// Thread ID des Fensters ermitteln
  dwThreadID
:= GetWindowThreadProcessId(hWindow, nil);
 
   
// Get the thread ID for the current thread
 
// Thread ID fьr den aktuellen Thread ermitteln
  dwCurrentThreadID
:= GetCurrentThreadId;
 
   
// If the cursor owner is not us then we must attach to
 
// the other thread in so that we can use GetCursor() to
 
// return the correct hCursor
 
 
// Wenn der Mauszeiger zu einem anderen Thread gehцrt, mьssen wir
 
// an den anderen Thread anhдngen.
 
 
if (dwCurrentThreadID <> dwThreadID) then
   
begin
     
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
     
begin
       
// Das Handle des Mauszeigers ermitteln
     
// Get the handle to the cursor
     
Result := GetCursor;
       
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
     
end;
   
end else
   
begin
     
Result := GetCursor;
   
end;
 
end;
 
 procedure TForm1
.Button1Click(Sender: TObject);
 
var
   
CurPosX, CurPoxY: Integer;
   
MyCursor: TIcon;
   pIconInfo
: TIconInfo;
 
begin
   
MyCursor := TIcon.Create;
   
try
     
MyCursor.Handle := GetCursorHandle;
     
// Retrieves information about the specified cursor.
   
// Informationen ьber den Mauszeiger auslesen
   
GetIconInfo(MyCursor.Handle, pIconInfo);
     
CurPosX := pIconInfo.xHotspot;
     
CurPoxY := pIconInfo.yHotspot;
     
// Draw the Cursor on the form
   
// Den Mauszeiger auf die Form zeichnen
   
Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
   
finally
     
MyCursor.ReleaseHandle;
     
MyCursor.Free;
   
end;
 
end;
 
 
// Another Solution:
// Andere Mцglichkeit:
 
procedure TForm1
.Timer1Timer(Sender: TObject);
 
var
   CI
: TCursorInfo;
 
begin
   CI
.cbSize := SizeOf(CI);
   
GetCursorInfo(CI);
   Image1
.Picture.Icon.Handle := CI.hCursor;
 
end;