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:

Imagem

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.