Search no titulo da janela (api)

Delphi

06/09/2005

Salve Salve gurus de plantão !

Minha dúvida está tirando meu sono a algumas noites ja:

existe a possibilidade de fazer um ´search´ em todas as janelas ativas do sistema, e verificar se ela existe, utilizando ´parte´ do titulo?

por exemplo, um user me manda uma mensagem via msn, como eu posso mapear isso e saber que aquela janela é parte do processo do msn ?

outra situação:
eu tenho varias janelas de mensagens abertas, estou teclando com varias pessoas ao mesmo tempo... existe como eu localizar a janela de um usuario chamado ´zé das coves´, informando somente parte desse titulo ? zé, ou coves ???

A adriano, me sugeriu algo como:
[b:56c1e788df]FindWindow(nil, Pos(´TEXTO_PROCURADO´,´CAPTION_DO_FORM´));[/b:56c1e788df]

mais num consegui nao.... :shock:

Antecipadamente, deixo aqui meus sinceros agradecimentos !!!


Brazilianboy

Brazilianboy

Curtidas 0

Respostas

Nildo

Nildo

06/09/2005

Vou mandar esse tópico por e-mail p/ eu responder amanhã que eu tenho o Help do delphi la no serviço. Dai eu te respondo

Falows


GOSTEI 0
Brazilianboy

Brazilianboy

06/09/2005

[b:3b12a6af95]Tamo ai no aguardo... brigadao mesmo !!![/b:3b12a6af95]


GOSTEI 0
Nildo

Nildo

06/09/2005

Existe uma API que se chama [b:b806d5be88]EnumWindows[/b:b806d5be88]. Nela você passa o ponteiro para uma função de CallBack. Essa função vai passar por todas as janelas e vai disparar esse evento para você, te dando o Handle da janela.

Então primeiro você cria esse CallBack com esses parâmetros:

function EnumProc( nHandle: HWND ; lParam: Integer ): Boolean; Export; StdCall;


Dentro desse CallBack, você faz:

var
   Buffer : Array[0..99] of char;
begin
   GetWindowText( nHandle, Buffer, 100 );
   
   if Pos( ´Pedaço do título´, Buffer ) <> 0 then
      ShowMessage( ´achou: ´ + inttostr( nHandle ) );
end;


E para chamar essa rotina você usa:

EnumWindows( @EnumProc, 0 );



GOSTEI 0
Adriano Santos

Adriano Santos

06/09/2005

Existe uma API que se chama [b:75c26078df]EnumWindows[/b:75c26078df]. Nela você passa o ponteiro para uma função de CallBack. Essa função vai passar por todas as janelas e vai disparar esse evento para você, te dando o Handle da janela. Então primeiro você cria esse CallBack com esses parâmetros:
function EnumProc( nHandle: HWND ; lParam: Integer ): Boolean; Export; StdCall;
Dentro desse CallBack, você faz:
var
   Buffer : Array[0..99] of char;
begin
   GetWindowText( nHandle, Buffer, 100 );
   
   if Pos( ´Pedaço do título´, Buffer ) <> 0 then
      ShowMessage( ´achou: ´ + inttostr( nHandle ) );
end;
E para chamar essa rotina você usa:
EnumWindows( @EnumProc, 0 );


E ai velhinho, beleza. Boa dica, mas não consegui compilar...diz:
[b:75c26078df]Variable required;[/b:75c26078df], se liga:

...
  public
    { Public declarations }
    function EnumProc( nHandle: HWND ; lParam: Integer ): Boolean; Export; StdCall;
  end;
...

function TForm1.EnumProc(nHandle: HWND; lParam: Integer): Boolean;
var
   Buffer : Array[0..99] of char;
begin
   GetWindowText(nHandle, Buffer, 100);
   if Pos(´meu texto´, Buffer) <> 0 then
      ShowMessage( ´Achou: ´ + IntToStr(nHandle));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hHandle : THandle;
begin
  EnumWindows(@EnumProc, 0);
end;



É isso, não é?


GOSTEI 0
Nildo

Nildo

06/09/2005

Tira a EnumProc do Form1. Deixa solto, com o Export e o StdCall


GOSTEI 0
Adriano Santos

Adriano Santos

06/09/2005

Tira a EnumProc do Form1. Deixa solto, com o Export e o StdCall


Desculpe a ignorância [b:2cf6b5a3d9]nildo[/b:2cf6b5a3d9], mas não funcionou...quero dizer...compila, mas não encontrou nada...será que tô viajando pesado?


GOSTEI 0
Nildo

Nildo

06/09/2005

Tira o IF, coloca uns ShowMessage do Buffer pra ver se ta passando pelas janelas mesmo


GOSTEI 0
Adriano Santos

Adriano Santos

06/09/2005

Tira o IF, coloca uns ShowMessage do Buffer pra ver se ta passando pelas janelas mesmo


É tah passando, mas levando em consideração que tenho mais de uma janela aberta ele só dá um ShowMessage, ou seja, parece que só passa por uma janela e ai sai fora...estranho né?

Tah bem simples, é só pra fazer o teste mesmo:

function EnumProc(nHandle: HWND; lParam: Integer): Boolean;
var
   Buffer : Array[0..99] of char;
begin
   GetWindowText(nHandle, Buffer, 100);
   ShowMessage( ´Achou: ´ + IntToStr(nHandle));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@EnumProc, 0);
end;



GOSTEI 0
Nildo

Nildo

06/09/2005

Nao tire o Export e nem o StdCall. Vamos tentar tirar a VCL também. Deve ficar assim:


function EnumProc(nHandle: HWND; lParam: Integer): Boolean; export; stdcall;
var
   Buffer : Array[0..99] of char;
begin
   GetWindowText(nHandle, Buffer, 100);
   MessageBox( 0, Buffer, ´Teste´, 0 );   
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@EnumProc, 0);
end;



GOSTEI 0
Adriano Santos

Adriano Santos

06/09/2005

Nao tire o Export e nem o StdCall. Vamos tentar tirar a VCL também. Deve ficar assim:
function EnumProc(nHandle: HWND; lParam: Integer): Boolean; export; stdcall;
var
   Buffer : Array[0..99] of char;
begin
   GetWindowText(nHandle, Buffer, 100);
   MessageBox( 0, Buffer, ´Teste´, 0 );   
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@EnumProc, 0);
end;


Ah, entendi...é que eu declarei a fuction CallBack antes do implementation com o Export e StdCall, dai criei a função depois sem isso. Não precisa declarar la em cima então?

Mesmo assim, uma vez apareceu a mensagem com o caption do Avg Email Scanner, depois apareceu a MessageBox sem texto.


GOSTEI 0
Nildo

Nildo

06/09/2005

É porque existem janelas que não possuem texto, só um Handle


GOSTEI 0
Brazilianboy

Brazilianboy

06/09/2005

[b:f8e0ac2cd7]:twisted: MATOU A PAU ![/b:f8e0ac2cd7]

Problema resolvido !

Era exatamente isso, valeu galera !


GOSTEI 0
POSTAR