2025-11-16 22:56:35 +00:00
|
|
|
# 🚨 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:**
|
|
|
|
|
|
|
|
|
|
```csharp
|
|
|
|
|
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):**
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"window_title": "[IDLE]",
|
|
|
|
|
"application_name": "System Idle"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Depois (CORRETO):**
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"window_title": "Documento - Word",
|
|
|
|
|
"application_name": "WINWORD.EXE"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
ou
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"window_title": "Visual Studio Code",
|
|
|
|
|
"application_name": "Code.exe"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
ou
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"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
|
|
|
|
|
|
|
|
|
|
1. **No Cliente Windows:**
|
|
|
|
|
- Abra o Visual Studio Code
|
|
|
|
|
- Verifique se o cliente está enviando: `window_title: "Visual Studio Code"` e `application_name: "Code.exe"`
|
|
|
|
|
- Abra o Chrome
|
|
|
|
|
- Verifique se está enviando: `window_title: "Título da aba"` e `application_name: "chrome.exe"`
|
|
|
|
|
|
|
|
|
|
2. **No Servidor (verificar logs):**
|
|
|
|
|
```bash
|
2025-11-16 23:38:59 +00:00
|
|
|
pm2 logs noidle-api --lines 20
|
2025-11-16 22:56:35 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Procure por:
|
|
|
|
|
- ✅ `✅ Atividade registrada: chrome.exe - YouTube` (correto)
|
|
|
|
|
- ❌ `⚠️ ATENÇÃO: Recebendo atividade com window_title inválido` (errado)
|
|
|
|
|
|
|
|
|
|
3. **Na Interface Web:**
|
|
|
|
|
- Acesse `https://admin.noidle.tech/activities`
|
|
|
|
|
- Deve aparecer os nomes reais dos aplicativos e janelas
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 📄 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.
|
|
|
|
|
|