当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。本文阐述如何在任何线程掌握光标时都能够获取光标句柄。
=========================================================
{ 当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。 本文阐述如何在任何线程掌握光标时都能够获取光标句柄。 例如,想在屏幕截取程序中放置光标时该如何做。 }
function GetCursorHandle: HCURSOR; var hWindow: HWND; pt: TPoint; pIconInfo: TIconInfo; dwThreadID, dwCurrentThreadID: DWORD; begin // 检查哪个窗体掌握光标 GetCursorPos(pt); hWindow := WindowFromPoint(pt);
// 获得光标所有者的线程ID dwThreadID := GetWindowThreadProcessId(hWindow, nil);
// 获得当前线程的ID dwCurrentThreadID := GetCurrentThreadId;
// 如果光标所有者的线程不是当前线程,就要把光标所有者的线程配属到当前线程。 //然后调用GetCursor()来获得正确的光标句柄(hCursor)。
if (dwCurrentThreadID <> dwThreadID) then begin if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then begin // 获得光标句柄 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; // 获得光标位置 GetIconInfo(MyCursor.Handle, pIconInfo); CurPosX := pIconInfo.xHotspot; CurPoxY := pIconInfo.yHotspot; // 在窗体上画出光标 Canvas.Draw(CurPoxY, CurPoxY, MyCursor); finally MyCursor.ReleaseHandle; MyCursor.Free; end; end;
// 另外一种解决办法:
procedure TForm1.Timer1Timer(Sender: TObject); var CI: TCursorInfo; begin CI.cbSize := SizeOf(CI); GetCursorInfo(CI); Image1.Picture.Icon.Handle := CI.hCursor; end;
没有相关教程
|