Mega Code Archive

 
Categories / Delphi / Graphic
 

Obtain A Handle To the Current Cursor

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;