// 1. Obtem o handle e a posição do mouse function GetCursorInfo2: TCursorInfo; var
hWindow: HWND;
pt: TPoint;
pIconInfo: TIconInfo;
dwThreadID, dwCurrentThreadID: DWORD; begin
Result.hCursor := 0;
ZeroMemory(@Result, SizeOf(Result)); // Encontra a janela "mae" do mouse if GetCursorPos(pt) then begin
Result.ptScreenPos := pt;
hWindow := WindowFromPoint(pt); if IsWindow(hWindow) then begin // Pega a thread do owner do mouse
dwThreadID := GetWindowThreadProcessId(hWindow, nil);
// Pega o id da thread atual
dwCurrentThreadID := GetCurrentThreadId;
if (dwCurrentThreadID <> dwThreadID) then begin if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then begin // Obtem o handle do cursor
Result.hCursor := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False); end; end else begin
Result.hCursor := GetCursor; end; end; end; end;
// 2. Captura tela function CaptureScreen: TBitmap; var
DC: HDC;
ABitmap: TBitmap;
MyCursor: TIcon;
CursorInfo: TCursorInfo;
IconInfo: TIconInfo; begin // captura tela
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); // Cria icone temporario
MyCursor := TIcon.Create; try // Devolve informação do cursor
CursorInfo := GetCursorInfo2; if CursorInfo.hCursor <> 0 then begin
MyCursor.Handle := CursorInfo.hCursor;
GetIconInfo(CursorInfo.hCursor, IconInfo); // Desenha o cursor no bmp
ABitmap.Canvas.Draw(CursorInfo.ptScreenPos.X - IconInfo.xHotspot,
CursorInfo.ptScreenPos.Y - IconInfo.yHotspot, MyCursor); end; finally // limpa tudo
MyCursor.ReleaseHandle;
MyCursor.Free; end; finally
ReleaseDC(GetDesktopWindow, DC); end;
Result := ABitmap; end;
//Exemplo de uso:
procedure TForm1.Button1Click(Sender: TObject); begin
Image1.Picture.Assign(CaptureScreen); end;