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

Previous  Top  Next

    
 

 

Code:

{

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;

 

©Drkb::01599