- Cliente Windows com modo silencioso e auto-start robusto - Backend Node.js + API REST - Frontend Next.js + Dashboard - Scripts PowerShell de configuração e diagnóstico - Documentação completa - Build scripts para Windows e Linux - Solução de auto-start após reinicialização Resolução do problema: Cliente não voltava ativo após reboot Solução: Registro do Windows + Task Scheduler + Modo silencioso
4.8 KiB
🚨 Problema: Monitoração não está capturando dados reais
❌ Situação Atual
O cliente Windows DESKTOP-BC16GDH está enviando dados, mas apenas:
window_title:"[IDLE]"application_name:"System Idle"
Resultado: Todas as atividades aparecem como "System Idle" na interface, mesmo quando o usuário está usando aplicativos.
🔍 O que está acontecendo
Backend (Servidor) ✅
- ✅ Está recebendo os dados corretamente
- ✅ Está salvando no banco de dados
- ✅ Está detectando e avisando quando recebe dados inválidos
- ✅ Logs mostram:
⚠️ ATENÇÃO: Recebendo atividade com window_title inválido: "[IDLE]"
Cliente Windows (DESKTOP-BC16GDH) ❌
- ❌ Não está capturando o título real da janela ativa
- ❌ Não está capturando o executável real do processo
- ❌ Está enviando valores fixos "System Idle" e "[IDLE]"
✅ Solução: Atualizar o Cliente Windows
O código do cliente precisa ser modificado para capturar dados reais usando APIs do Windows.
1. Capturar Janela Ativa e Processo
Código C# necessário:
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
// Função para obter dados da janela ativa
public (string windowTitle, string applicationName) GetActiveWindowInfo()
{
try
{
// Obter janela ativa
IntPtr hwnd = GetForegroundWindow();
if (hwnd == IntPtr.Zero)
{
return ("[IDLE]", "System Idle");
}
// Obter título da janela
StringBuilder windowTitle = new StringBuilder(256);
GetWindowText(hwnd, windowTitle, 256);
// Obter processo
uint processId;
GetWindowThreadProcessId(hwnd, out processId);
Process process = Process.GetProcessById((int)processId);
string appName = process.ProcessName + ".exe";
// Se não conseguiu obter título, usar nome do processo
string title = windowTitle.ToString();
if (string.IsNullOrWhiteSpace(title))
{
title = appName;
}
// NÃO retornar "System Idle" se há uma janela ativa
return (title, appName);
}
catch (Exception ex)
{
Console.WriteLine($"Erro ao obter janela ativa: {ex.Message}");
return ("[ERRO]", "Unknown");
}
}
2. Enviar Dados Reais
Antes (ERRADO):
{
"window_title": "[IDLE]",
"application_name": "System Idle"
}
Depois (CORRETO):
{
"window_title": "Documento - Word",
"application_name": "WINWORD.EXE"
}
ou
{
"window_title": "Visual Studio Code",
"application_name": "Code.exe"
}
ou
{
"window_title": "YouTube",
"application_name": "chrome.exe"
}
📋 Checklist para o Desenvolvedor do Cliente
- Implementar
GetForegroundWindow()para obter janela ativa - Implementar
GetWindowText()para obter título da janela - Implementar
GetWindowThreadProcessId()para obter processo - Usar
Process.GetProcessById()para obter nome do executável - NÃO enviar "System Idle" quando há uma janela ativa
- Enviar dados reais mesmo quando o usuário está trabalhando
- Testar com diferentes aplicativos (Chrome, Word, VS Code, etc.)
🔧 Como Testar
-
No Cliente Windows:
- Abra o Visual Studio Code
- Verifique se o cliente está enviando:
window_title: "Visual Studio Code"eapplication_name: "Code.exe" - Abra o Chrome
- Verifique se está enviando:
window_title: "Título da aba"eapplication_name: "chrome.exe"
-
No Servidor (verificar logs):
pm2 logs pointcontrol-api --lines 20Procure por:
- ✅
✅ Atividade registrada: chrome.exe - YouTube(correto) - ❌
⚠️ ATENÇÃO: Recebendo atividade com window_title inválido(errado)
- ✅
-
Na Interface Web:
- Acesse
https://admin.noidle.tech/activities - Deve aparecer os nomes reais dos aplicativos e janelas
- Acesse
📄 Documentação Completa
Veja o arquivo ESPECIFICACAO_CLIENTE_WINDOWS.md para a especificação completa de todos os endpoints e campos necessários.
🎯 Resumo
O problema NÃO está no servidor. O servidor está funcionando perfeitamente e recebendo os dados.
O problema ESTÁ no cliente Windows que precisa ser atualizado para capturar dados reais dos aplicativos e janelas ativas.
Ação necessária: Atualizar o código do cliente Windows para usar as APIs do Windows e capturar dados reais.