Página 1 de 1
detetar computador em atividade
Enviado: 14 Set 2013 15:47
por cjp
Pessoal, alguém sabe me dizer se existe um jeito de detetar se o computador está em atividade (ou seja, se o usuário efetivamente está usando qualquer programa) por meio de um programa feito em Harbour?
Eu vi que a API Getlastimputinfo do Windows faz isso, mas não consegui fazê-la rodar de dentro do meu programa, embora já tenha tentado a sugestão dada neste fórum no link viewtopic.php?f=43&t=14150&p=82551&hilit=api+do+windows#p82551.
Alguém poderia me ajudar com isto?
detetar computador em atividade
Enviado: 15 Set 2013 19:43
por yugi386
Prezado Cjp,
Em relação à API do Windows não tenho conhecimento para lhe ajudar.
Mas existe uma maneira alternativa para verificar os programas em execução no momento em um PC com sistema operacional windows.
Você pode se valer do comando
[tasklist] que exibe uma lista de aplicativos em execução no momento em um computador local ou remoto (rede).
Para utilizar este comando proceda assim:
Código: Selecionar todos
procedure SoftwareCarregado()
comando := "tasklist > a.txt"
memowrit("a.bat",comando)
executaBatch("a.bat","a.vbs")
return NIL
obs: caso seja um computador ligado na rede substitua a linha
comando := "tasklist > a.txt" por esta
comando := "tasklist /s {nome-da-maquina} /u {nome-do-usuario} /p {senha} > a.txt"
Código da função executaBatch:
Código: Selecionar todos
* =======================================================================================
/**
Executa um arquivo de lote ou programa silenciosamente sem mostrar a tela do DOS ou
qualquer janela!!!
Funciona somente no windows pois utiliza VBscript
*/
* ========================================================================================
procedure executaBatch(arquivoBAT,arquivoVBS)
if file(arquivoVBS)
delete file &arquivoVBS
endif
comando:= 'Set WshShell = WScript.CreateObject("WScript.Shell")' + QUEBRA +;
'Dim statusCode' + QUEBRA +;
'Dim fso' + QUEBRA +;
'statusCode = WshShell.Run ("' +arquivoBAT+ '", 0, true)' + QUEBRA +;
'Set fso = CreateObject("Scripting.FileSystemObject")' + QUEBRA +;
'fso.MoveFile ' + '"' + arquivoBAT + '"' + ',' + '"' + arquivoBAT + '.tmp"'
memowrit(arquivoVBS,comando)
EXECUTE FILE arquivoVBS // executando o script VBS
// Rotina para fazer com que a execução do script seja completada
// antes de terminar a thread
arq := arquivoBAT + ".tmp"
do while.t.
if file(arq)
delete file &arq
exit
endif
inkey(0.5)
enddo
// excluindo script VBS
comando := arquivoVBS
delete file &comando
return
Com este código você terá um arquivo texto com todos os aplicativos que estão rodando no PC.
A listagem fica mais ou menos assim:
Aí basta você verificar quais os serviços e recursos do windows necessários para a máquina especificamente.
Depois leia o arquivo resultante linha por linha e verifique o resultado. Se houver um nome diferente dos nomes dos serviços e recursos do windows então o usuário está utilizando um outro programa.
Por exemplo, se o usuário estiver com o firefox aberto o arquivo a.txt conterá algo como:
firefox.exe 4640 Console 1 303.792 K
Desta forma é possível verificar se a máquina está ociosa ou se existe um programa rodando.
A única ressalva é você saber quais são os programas residentes (como antivírus, firewall, etc) para desconsiderá-los de sua lista de verificação. E na sua lista vai aparecer o cmd.exe, o tasklist e provavelmente o wscript (que executa arquivo vbs no windows). Você deve desconsiderá-los também.
Espero ter ajudado,
Yugi.
detetar computador em atividade
Enviado: 16 Set 2013 00:52
por cjp
Entendido, caro Yugi. Mas eu já havia tentado esta solução, mas ela não resolve o que preciso.
Imagine que o usuário abriu o Firefox, deixou aberto e saiu da frente do computador. A tasklist irá resultar o Firefox em uso, mas de fato o usuário não estará efetivamente usando o computador. Entendeu?
detetar computador em atividade
Enviado: 16 Set 2013 06:58
por yugi386
Neste caso seria interessante você verifica o uso do processador. Mesmo assim, imagine que o anti-virus resolve fazer a atualização e então o usuário não estará usando o sistema mas existirá processamento, ou ainda, as atualizações automáticas do windows, etc...
Para permanecer no uso do tasklist você pode verificar além do nome do programa o uso da memória correspondente. Se fizer esta verificação algumas vezes vai verificar que o valor de uso da memória se mantém constante, ou quase constante, se o programa estiver aberto mas sem uso.
Desta forma, talvez seja possível monitorar isto e chegar ao resultado que você precisa.
Yugi.
detetar computador em atividade
Enviado: 17 Set 2013 00:08
por cjp
E como faço para verificar o uso da memória? Tem como fazer isto pelo Harbour?
detetar computador em atividade
Enviado: 17 Set 2013 06:37
por yugi386
O próprio comando tasklist já te apresenta o uso de cada processo carregado na máquina e a memória que ele está usando (última coluna da informação).
Tudo o que você tem que fazer é ler cada linha deste arquivo (ignorar serviços do windows,anti-vírus, firewall, etc) verificar os programas abertos, e ler também a memória que cada um está usando. Armazene estas informações em um array, por exemplo.
Posteriormente repetir a leitura mais umas 4 ou 5 vezes, sempre observando e comparando os valores de memória lidos por aplicativo. Faça um pequeno intervalo entre as leituras (5 ou 10 segundos por exemplo).
Se este valor for igual ou muito próximo as leituras feitas anteriormente então, muito provavelmente, o aplicativo está aberto, mas sem uso. É bom tecer uma margem de tolerãncia, por exemplo, considerar diferenças se o uso da memória for maior ou menor em 3Kb por exemplo.
att,
Yugi.
detetar computador em atividade
Enviado: 18 Set 2013 00:04
por cjp
Entendi, meu caro. Obrigado. Vou fazer uns testes.