...ein Handle zum aktuellen Mauszeiger erhalten?

Autor: Thomas Stutz

Kategorie: Grafik

{
  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.
}

{
  Die GetCursor() API gibt das Handle auf den aktuellen Mauszeiger zurück.
  Wenn Der Mauszeiger aber zu einem anderen Thread gehört, funktioniert die GetCursor()
  nicht ohne weiteres.
  Dieses Beispiel zeigt, wie man das Handle zum aktuellen Mauszeiger systemweit ermitteln kann,
  egal zu welchem Thread der Mauszeiger gehört.
  Der Code ist z.B nützlich, wenn man in einem "Screen Shot" den Mauszeiger zeigen möchte.
}

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;

 

printed from
www.swissdelphicenter.ch
developers knowledge base