Title: obtain a handle to the current Cursor?
{
TheGetCursor()APIislimitedinthatitdoesnot,bydefault,returnahandletothecurrent
cursorwhenthatcursorisownedbyanotherthread.Thisarticledemonstratesawaytoretrieve
thecurrentcursorregardlessofwhatthreadownsit.
Forexample,whenyouwishtoincludetheimageofthecursorinascreencapture.
}
{
DieGetCursor()APIgibtdasHandleaufdenaktuellenMauszeigerzurck.
WennDerMauszeigeraberzueinemanderenThreadgehrt,funktioniertdieGetCursor()
nichtohneweiteres.
DiesesBeispielzeigt,wiemandasHandlezumaktuellenMauszeigersystemweitermittelnkann,
egalzuwelchemThreadderMauszeigergehrt.
DerCodeistz.Bntzlich,wennmanineinem"ScreenShot"denMauszeigerzeigenmchte.
}
functionGetCursorHandle:HCURSOR;
var
hWindow:HWND;
pt:TPoint;
pIconInfo:TIconInfo;
dwThreadID,dwCurrentThreadID:DWORD;
begin
//Findoutwhichwindowownsthecursor
//DaszumMauszeigerzugehrigeFensterfinden
GetCursorPos(pt);
hWindow:=WindowFromPoint(pt);
//GetthethreadIDforthecursorowner.
//ThreadIDdesFenstersermitteln
dwThreadID:=GetWindowThreadProcessId(hWindow,nil);
//GetthethreadIDforthecurrentthread
//ThreadIDfrdenaktuellenThreadermitteln
dwCurrentThreadID:=GetCurrentThreadId;
//Ifthecursorownerisnotusthenwemustattachto
//theotherthreadinsothatwecanuseGetCursor()to
//returnthecorrecthCursor
//WennderMauszeigerzueinemanderenThreadgehrt,mssenwir
//andenanderenThreadanhngen.
if(dwCurrentThreadIDdwThreadID)then
begin
ifAttachThreadInput(dwCurrentThreadID,dwThreadID,True)then
begin
//DasHandledesMauszeigersermitteln
//Getthehandletothecursor
Result:=GetCursor;
AttachThreadInput(dwCurrentThreadID,dwThreadID,False);
end;
endelse
begin
Result:=GetCursor;
end;
end;
procedureTForm1.Button1Click(Sender:TObject);
var
CurPosX,CurPoxY:Integer;
MyCursor:TIcon;
pIconInfo:TIconInfo;
begin
MyCursor:=TIcon.Create;
try
MyCursor.Handle:=GetCursorHandle;
//Retrievesinformationaboutthespecifiedcursor.
//InformationenberdenMauszeigerauslesen
GetIconInfo(MyCursor.Handle,pIconInfo);
CurPosX:=pIconInfo.xHotspot;
CurPoxY:=pIconInfo.yHotspot;
//DrawtheCursorontheform
//DenMauszeigeraufdieFormzeichnen
Canvas.Draw(CurPoxY,CurPoxY,MyCursor);
finally
MyCursor.ReleaseHandle;
MyCursor.Free;
end;
end;
//AnotherSolution:
//AndereMglichkeit:
procedureTForm1.Timer1Timer(Sender:TObject);
var
CI:TCursorInfo;
begin
CI.cbSize:=SizeOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle:=CI.hCursor;
end;