В GetCursor() API есть ограничение в том, что этого нет по умолчанию, возвращение дескриптора текущего  курсор, когда курсор принадлежит другому потоку. В данной статье демонстрируется способ извлечения

 текущее курсора независимо от того, какой поток принадлежит.  Например, если вы хотите включить изображение курсора в захват экрана.

Code:

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;

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить