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

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

{
 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;

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...