Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Включить изображение курсора в снимок экрана

Delphi , ОС и Железо , Мышка и Курсор

Включить изображение курсора в снимок экрана

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

// 1. Get the handle to the current mouse-cursor and its position 
function GetCursorInfo2: TCursorInfo;
 var
  hWindow: HWND;
  pt: TPoint;
  pIconInfo: TIconInfo;
  dwThreadID, dwCurrentThreadID: DWORD;
 begin
  Result.hCursor := 0;
  ZeroMemory(@Result, SizeOf(Result));
  // Find out which window owns the cursor 
 if GetCursorPos(pt) then
  begin
    Result.ptScreenPos := pt;
    hWindow := WindowFromPoint(pt);
    if IsWindow(hWindow) then
    begin
      // Get the thread ID for the cursor owner. 
     dwThreadID := GetWindowThreadProcessId(hWindow, nil);

      // Get the thread ID for the current thread 
     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 
     if (dwCurrentThreadID <> dwThreadID) then
      begin
        if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
        begin
          // Get the handle to the cursor 
         Result.hCursor := GetCursor;
          AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
        end;
      end
      else
      begin
        Result.hCursor := GetCursor;
      end;
    end;
  end;
 end;

 // 2. Capture the screen 
function CaptureScreen: TBitmap;
 var
  DC: HDC;
  ABitmap: TBitmap;
  MyCursor: TIcon;
  CursorInfo: TCursorInfo;
  IconInfo: TIconInfo;
 begin
  // Capture the Desktop screen 
 DC := GetDC(GetDesktopWindow);
  ABitmap := TBitmap.Create;
  try
    ABitmap.Width  := GetDeviceCaps(DC, HORZRES);
    ABitmap.Height := GetDeviceCaps(DC, VERTRES);
    // BitBlt on our bitmap 
   BitBlt(ABitmap.Canvas.Handle,
      0,
      0,
      ABitmap.Width,
      ABitmap.Height,
      DC,
      0,
      0,
      SRCCOPY);
    // Create temp. Icon 
   MyCursor := TIcon.Create;
    try
      // Retrieve Cursor info 
     CursorInfo := GetCursorInfo2;
      if CursorInfo.hCursor <> 0 then
      begin
        MyCursor.Handle := CursorInfo.hCursor;
        // Get Hotspot information 
       GetIconInfo(CursorInfo.hCursor, IconInfo);
        // Draw the Cursor on our bitmap 
       ABitmap.Canvas.Draw(CursorInfo.ptScreenPos.X - IconInfo.xHotspot,
                            CursorInfo.ptScreenPos.Y - IconInfo.yHotspot, MyCursor);
      end;
    finally
      // Clean up 
     MyCursor.ReleaseHandle;
      MyCursor.Free;
    end;
  finally
    ReleaseDC(GetDesktopWindow, DC);
  end;
  Result := ABitmap;
 end;

 // Example: Capture the screen and include the cursor. 
// Show the Screenshot in Image1 

procedure TForm1.Button1Click(Sender: TObject);
 begin
   Image1.Picture.Assign(CaptureScreen);
 end;

Это программный код на Delphi, который захватывает экран и включает в снимок текущий курсор мыши. Функция GetCursorInfo2 получает информацию о текущем курсоре, включая его позицию на экране. Функция CaptureScreen использует эту информацию для захвата экрана и рисования курсора в его правильном положении.

Разбивка кода:

  1. GetCursorInfo2:
    • Получает handle текущего курсора мыши и его позиции с помощью GetCursorPos.
    • Получает ID потока для владельца курсора с помощью GetWindowThreadProcessId.
    • Если владелец курсора не является текущим потоком, привязывает к этому потоку с помощью AttachThreadInput, получает handle курсора с помощью GetCursor, а затем отключается от этого потока.
    • Возвращает структуру TCursorInfo, содержащую handle курсора и его позицию на экране.
  2. CaptureScreen:
    • Захватывает экран с помощью GetDC и BitBlt.
    • Создает объект TBitmap для хранения снимка экрана.
    • Получает информацию о курсоре с помощью GetCursorInfo2.
    • Если курсор не равен 0, создает иконку из handle курсора с помощью TIcon, получает информацию о hotspot с помощью GetIconInfo и рисует курсор на битовом изображении в правильном положении.
    • Возвращает захваченный экран в виде объекта TBitmap.
  3. Пример:
    • Процедура Button1Click вызывается при клике кнопки, которая захватывает экран с помощью CaptureScreen и присваивает его компоненту Image1.

Программа использует встроенные функции Delphi для графики, такие как GetDC, BitBlt, TBitmap и TIcon, для захвата экрана и рисования курсора на нем. Использование AttachThreadInput позволяет программе получать правильную информацию о курсоре даже если владелец курсора не является текущим потоком.

В целом, это хорошо структурированная и эффективная программа, которая достигает своей цели захвата экрана с включенным курсором мыши.

В статье описывается способ включения изображения курсора в снимок экрана при помощи языка программирования Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Мышка и Курсор ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:38:08/0.0055840015411377/1