Search no titulo da janela (api)
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 !!!
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
Curtidas 0
Respostas
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
Falows
GOSTEI 0
Brazilianboy
06/09/2005
[b:3b12a6af95]Tamo ai no aguardo... brigadao mesmo !!![/b:3b12a6af95]
GOSTEI 0
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:
Dentro desse CallBack, você faz:
E para chamar essa rotina você usa:
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
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:
Dentro desse CallBack, você faz:
E para chamar essa rotina você usa:
function EnumProc( nHandle: HWND ; lParam: Integer ): Boolean; Export; StdCall;
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;
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
06/09/2005
Tira a EnumProc do Form1. Deixa solto, com o Export e o StdCall
GOSTEI 0
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
06/09/2005
Tira o IF, coloca uns ShowMessage do Buffer pra ver se ta passando pelas janelas mesmo
GOSTEI 0
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
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
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
06/09/2005
É porque existem janelas que não possuem texto, só um Handle
GOSTEI 0
Brazilianboy
06/09/2005
[b:f8e0ac2cd7]:twisted: MATOU A PAU ![/b:f8e0ac2cd7]
Problema resolvido !
Era exatamente isso, valeu galera !
Problema resolvido !
Era exatamente isso, valeu galera !
GOSTEI 0