Fórum Pegar o "Pai" de um Handle. #393644
11/01/2011
0
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
Curtir tópico
+ 0Posts
12/01/2011
Marcelo Diniz
Gostei + 0
12/01/2011
Guilherme Freitas
mas se alguem quiser pesquisar como faz isso a função usada foi EnumChildWindows.
Gostei + 0
12/01/2011
Guilherme Freitas
mas se alguem quiser pesquisar como faz isso a função usada foi EnumChildWindows.
Gostei + 0
12/01/2011
Guilherme Freitas
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ç
Gostei + 0
12/01/2011
Guilherme Freitas
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)