Fórum Pegar o "Pai" de um Handle. #393644

11/01/2011

0

Galera é o seguinte,

Estou fazendo um Robo que vai manipular outra aplicação.

o meu maior problema estava sendo simular o click em botoes do outro sistema, mas ai o que estou fazendo pego o Handle do botão usando o FindWindowEx, então resumindo.

Pego o Handle da Aplicação usando FindWindow, apos isso pego o Handle do Botão que desejo clicar usando FindWindowEx e com o handle em questão armazenado eu executo o seguinte comando

SendMessage(HndleButton,WM_LBUTTONDOWN,0,0);
SendMessage(HndleButton,WM_LBUTTONUP,0,0);

ate ai tudo beleza funciona 100%.

agora que vem o problema, tem um determinado botao que eu nao consigo pegar o Handle dele, imagino eu que porque ele deve pertencer a outro handle que não seja a janela principal (tipo um panel).

ai o que acontece encontrei na net o seguinte codigo fonte onde eu consigo pegar o handle e a classe do objeto onde o mouse aponta, e se eu passo o mouse no botao em questão eu pego o handle dele normalmente e se simulo o click usando o handle indicado pela rotina do mouse funciona.


  public
    { Public declarations }
    classname : array[0..255] of char;
    oldclassname : string;
  end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  cPos : TPoint;
  handle, T : THandle;
  Buffer : array[0..255] of Char;
begin
  GetCursorPos(cPos);
  handle := WindowFromPoint(cPos);
  GetClassName(handle,classname,256);



  if string(classname) <> oldclassname then begin
    Memo1.Lines.Add('--------------------');
    Memo1.Lines.Add('Handle: '+IntToStr(handle));
    Memo1.Lines.Add('Classe: '+ String(classname));
    oldclassname := string(classname);

    SendMessage(handle, WM_APP, 0, T);
    Memo1.Lines.Add('Buffer: '+IntToStr(Memo1.Parent.Handle));

  end;

end;



então o que preciso para resolver meu problema é saber as informaçoes (handle e Classe) do objeto que é "pai"  de  um handle X que ja tenho pois obtive ele atraves do codigo acima.



Se alguem conseguir me ajudar ficarei muito grato.
Guilherme Freitas

Guilherme Freitas

Responder

Posts

12/01/2011

Marcelo Diniz

Já tentou fazer algo para pegar todos os handles ?Tipo uma laço for, ainda você pode ir testando um por um.
Responder

Gostei + 0

12/01/2011

Guilherme Freitas

  Sim cara. ontem noite tive esse idéia, porem não encontrei muito material. ai comprei um artigo de um site e consegui fazer. só que o site me proíbe de divulgar o seu material.

mas se alguem quiser  pesquisar como faz isso a função usada foi EnumChildWindows.
Responder

Gostei + 0

12/01/2011

Guilherme Freitas

  Sim cara. ontem noite tive esse idéia, porem não encontrei muito material. ai comprei um artigo de um site e consegui fazer. só que o site me proíbe de divulgar o seu material.

mas se alguem quiser  pesquisar como faz isso a função usada foi EnumChildWindows.
Responder

Gostei + 0

12/01/2011

Guilherme Freitas

pessoal...

alguem sabe como descubro se o handle (button) esta enabled true ou false ??

estou tentando sendmessage(handle,WS_DISABLED... porem não da certo.. como devo pegar o resultado, se é que esse eh o caminho certo ...



abç
Responder

Gostei + 0

12/01/2011

Guilherme Freitas

o codigo fonte a seguir pega todos os handles filho de um handle pai.
creditos do site http://www.arquivodecodigos.net

// Função de Callback usada para listar todas as janelas
// filhas a partir do handle de uma janela pai
function EnumChildProc(wnd: HWND; Memo: TMemo): BOOL; stdcall;
var
  buf, caption: array[0..255] of char;
  id_control: Integer;
begin
  // vamos obter o nome da classe da janela filha
  GetClassName(wnd, buf, SizeOf(buf) - 1);

  // vamos obter o título da janela filha
  SendMessage(wnd, WM_GETTEXT, 256, Integer(@Caption));

  // vamos obter o ID da janela (ou controle) filha
  id_control := GetDlgCtrlID(wnd);

  // vamos adicionar as informações ao TMemo

    Memo.Lines.Add('ID: ' + IntToStr(id_control) + ' - ' +
    ' Classe: ' + buf + ' - Caption: ' + caption + ' Handle: ' + IntToStr(wnd));



  // continue com a próxima janela
  Result := true;
end;


procedure TForm1.Button1Click(Sender: TObject);
Var H : THandle;
begin
  Memo1.Clear;
  H := FindWindow(nil,Pchar('Calculadora'));
  If H > 0 Then
    EnumChildWindows(h, @EnumChildProc, Integer(Memo1));
end;



Queria agradescer ao professor Osmar proprietario do site que disponibilizou a dica.


agora a outra pergunta sobre saber se o Handle tem Enable false/true tbm foi fornecida pelo professor Osmar

  CheckBox2.Checked := IsWindowEnabled(Handle);


Topico Encerrado.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar