unit pegatudo;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, shellapi;

type
  TfrmPegatudo = class(TForm)
    Label2: TLabel;
    lbclasse: TLabel;
    tempo: TTimer;
    lbHandle: TLabel;
    Label4: TLabel;
    lbJanela: TLabel;
    Label5: TLabel;
    lbSenha: TLabel;
    Label7: TLabel;
    procedure tempoTimer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmPegatudo: TfrmPegatudo;

implementation

{$R *.dfm}

procedure TfrmPegatudo.tempoTimer(Sender: TObject);
var
  hWnd: THandle;
  CrPos: TPoint;
  nomejanela,
  nomeclasse,
  senha: string;
  tamJanela,
  tamClasse,
  tamSenha: integer;

begin
  try
    GetCursorPos(CrPos); // Identifica a posicao do mouse
    hWnd := WindowFromPoint(CrPos); // Pega o Handle do controle na posição do mouse

    if hwnd <> 0 then
    begin

      //captura o tamanho dos elementos
      tamJanela := GetWindowTextLength(hwnd) + SizeOf(Char);
      tamClasse := 256;  //o resultado de GetClassName traz um integer com
      //o número de caracteres copiados. Se for maior que 255 a string ou
      //ponteiro pode ser realocado/redimensionado com setsize/malloc e
      //pode ser usado GetClassName novamente para pegar a string completa
      //caso ela tenha vindo truncada.
      //o mesmo pode ser feito com GetWindowText, mas nesse caso a
      //GetWindowTextLength nos ajuda a obter esse tamanho
      //só é trazido o número de caracteres sem contar o terminator null #0

      SetLength(nomejanela, tamJanela);
      SetLength(nomeclasse, tamClasse);

      //preenche o conteúdo do vetor com char zeros
      FillChar((@nomejanela[1])^, tamJanela, #0);
      FillChar((@nomeclasse[1])^, tamClasse, #0);



      //pega o nome da janela
      GetWindowText(hWnd, pchar(integer(NomeJanela)), tamJanela);
      //pega o nome da classe
      GetClassName(hWnd, pchar(integer(nomeclasse)), tamClasse);

      //manda uma mensagem para o handle da janela
      //perguntando se ele possui um password char
      if SendMessage(hWnd, EM_GETPASSWORDCHAR, 0, 0) <> 0 then
      begin

        tamSenha := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0)+ SizeOf(Char);
        SetLength(senha, tamSenha);
        FillChar((@senha[1])^, tamSenha, #0);
        //Caso positivo manda a mensagem WM_GETTEXT
        SendMessage(hWnd, WM_GETTEXT, tamSenha, integer(@senha[1])); //o integer aqui faz com que o parâmetro seja passado como ponteiro em vez de vetor
        lbSenha.Caption :=      senha;

        //seta o passwordchar para #0 e
        SendMessage(hWnd, EM_SETPASSWORDCHAR, 0, 0);

      end;

      //preenche os campos
      lbHandle.Caption :=     IntToStr(hwnd);
      lbjanela.Caption :=     nomejanela;
      lbclasse.Caption :=     nomeclasse;


    end;

  except
  end;

end;

end.

