Imprimir
Categoria: Delphi
Acessos: 1735

Avaliação do Usuário

Estrela inativaEstrela inativaEstrela inativaEstrela inativaEstrela inativa
 


Esse projeto visa mostrar, entre outras coisas, como executar comandos do shell do Windows dentro de uma aplicação feita em Delphi e uma sugestão de como acessar o resultado da execução desses comandos para extrair alguns dados.

Como a proposta é obter todas as redes sem fios captadas pelo computador será necessário ter instalado uma interface de rede sem fio (placa de rede WiFi), mas esse não é fator determinante visto que o comando usado pode ser alterado facilmente para obter quaisquer dados que você desejar.

Construindo:

1. Crie um novo projeto;

2. No formulário coloque um componente TMemo, um TLabel e um TButton;
a. Para o TMemo acesse as propriedades Lines e apague o texto padrão existente nela e para a propriedade ScrollBars coloque o valor ssVertical;
b. Para o TButton coloque na propriedade CAPTION o texto “Captar”;

3. Crie um arquivo chamado executa.bat no mesmo local onde gravou seu projeto com o seguinte conteúdo:

{code}

@netsh wlan show networks mode=Bssid > dados.txt

{/code}

4. Clique duas vezes no botão “Captar” e vamos declarar as seguintes variáveis para a PROCEDURE onClick:

{code}

var  arquivo : TextFile;
linha, resultado : String;
i, j, inicio : Integer;

{/code}

5. Agora para o corpo da PROCEDURE digite:

{code}

WinExec('executa.bat',SW_HIDE);                   
while NOT FileExists('dados.txt') do Sleep(1000);  
memo1.Lines.Clear;
AssignFile(arquivo,'dados.txt');
Reset(arquivo);
while NOT EOF(arquivo) do
begin
ReadLn(arquivo,linha);
memo1.Lines.Add(Trim(linha));
end;
CloseFile(arquivo);
DeleteFile('dados.txt');
while FileExists('dados.txt') do Sleep(1000); 
for i := 1 to memo1.Lines.Count -1 do
begin
if UpperCase(Copy(memo1.Lines[i],0,4)) = 'SINA' then
begin
inicio := 0;
for j := 0 to Length(memo1.Lines[i]) - 1 do
begin
if copy(memo1.Lines[i],j,1) = ':' then
begin
inicio := j;
break;
end;
end;
Label1.Caption := trim(copy(memo1.Lines[i],inicio+1,length(memo1.lines[i])-inicio));
end;
end;

{/code}

Entendendo o Código:

Como a ideia é executar um comando do shell do Windows e capturar seu resultado precisamos criar um arquivo contendo esse resultado já que o Delphi não possibilita que façamos isso de uma forma direta. Sendo assim criamos um script para executar o seguinte comando:

@netsh wlan show networks mode=Bssid > dados.txt

O arroba diz que não é preciso repetir o comando na tela ao executá-lo e o comando netsh wlan networks mode=Bssid mostra todas as redes sem fio captadas pela placa de rede WiFi que sejam do modo infraestrutura, ou seja, possuam ao menos um Bssid. Com o sinal de maior direcionamos o que seria exibido na tela para o arquivo dados.txt.

No Delphi executamos esse arquivo com a seguinte linha:

WinExec('executa.bat',SW_HIDE);

Logo em seguida temos um while que aguarda que o arquivo dados.txt seja criado para continuar a execução. A cada laço que detectar que o arquivo ainda não existe aguarda 1 segundo.

while NOT FileExists('dados.txt') do Sleep(1000);

Em seguida o conteúdo do component TMemo é limpo e o arquivo dados.txt é lido para esse componente. Primeiro temos que determinar que a variável arquivo representa o arquivo físico dados.txt. Em seguida abrimos o arquivo somente para leitura com o comando RESET.

No laço WHILE repete-se a leitura de cada linha do arquivo até que seu final seja encontrado. O comando TRIM remove os espaços em branco da esquerda e da direita de uma string:

memo1.Lines.Clear;
AssignFile(arquivo,'dados.txt');
Reset(arquivo);
while NOT EOF(arquivo) do
begin
ReadLn(arquivo,linha);
memo1.Lines.Add(Trim(linha));
end;
CloseFile(arquivo);

Uma vez criado e lido podemos descartar o arquivo dados.txt, o que fazemos nas linhas abaixo. Como na criação do arquivo foi criado um laço WHILE que aguarda que o arquivo seja efetivamente excluído.

DeleteFile('dados.txt');
while FileExists('dados.txt') do Sleep(1000);

Para terminar corremos todas as linhas do componente MEMO em busca da palavra SINAL e capturamos o que vier depois do sinal de dois pontos que é a porcentagem de sinal captado para aquela rede. Dessa forma colocamos no LABEL o valor do sinal da rede sem fio captada se ela for única ou o sinal da última rede sem fio captada. Tendo esse exemplo fica fácil consegui obter todas os dados que você desejar e utilizá-lo da forma que quiser.

for i := 1 to memo1.Lines.Count -1 do
begin
if UpperCase(Copy(memo1.Lines[i],0,4)) = 'SINA' then
begin
inicio := 0;
for j := 0 to Length(memo1.Lines[i]) - 1 do
begin
if copy(memo1.Lines[i],j,1) = ':' then
begin
inicio := j;
break;
end;
end;
Label1.Caption := trim(copy(memo1.Lines[i],inicio+1,length(memo1.lines[i])-inicio));
end;
end;

Executando:

Execute seu programa e clique no botão “Captar”. No componente MEMO você verá o resultado da execução do comando shell do Windows e no LABEL a porcentagem do sinal da última rede captada:

Caso você obtenha uma mensagem de erro como a abaixo é porque o Windows sinalizou a existência do arquivo dados.txt, mas não o criou ainda efetivamente. Esse problema pode ser solucionado aumentando-se o tempo de espera para essa operação, basta para a execução e tentar novamente.


Agora basta um pouco de imaginação e tratar o texto obtido para desenvolver uma aplicação mais refinada.