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

Материал из DRKB

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

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


Language: en
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 01599