Skip to content

Commit

Permalink
fix: Corrigidos erros de codificação e adicionado README
Browse files Browse the repository at this point in the history
  • Loading branch information
josejefferson committed Jan 2, 2025
1 parent ce49ec8 commit b0c7a8f
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 16 deletions.
10 changes: 5 additions & 5 deletions Logoff Timer/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ static void Main()
{
while (true)
{
// Obtém o tempo de inatividade do usuário
// Obtém o tempo de inatividade do usuário
uint time = Helpers.GetIdleTimeInSeconds();
Debug.WriteLine($"O usuário está inativo há {time} segundos.");
Debug.WriteLine($"O usuário está inativo há {time} segundos.");

// Se o tempo de inatividade for maior ou igual ao tempo limite, exibe o popup de aviso e faz o logoff
if (time >= (INACTIVITY_TIME * 60))
Expand All @@ -29,7 +29,7 @@ static void Main()
}

/// <summary>
/// Exibe um popup de aviso de inatividade para o usuário e faz o logoff
/// Exibe um popup de aviso de inatividade para o usuário e faz o logoff
/// </summary>
static void Logoff()
{
Expand All @@ -45,11 +45,11 @@ static void Logoff()
}

/// <summary>
/// Exibe um popup de aviso de inatividade para o usuário
/// Exibe um popup de aviso de inatividade para o usuário
/// </summary>
static void WarnLogoff()
{
MessageBox.Show($"Você está há mais de {INACTIVITY_TIME} minutos inativo. O seu usuário será desconectado em {WARNING_TIME} minutos. Salve o seu trabalho.", "Aviso de inatividade", MessageBoxButtons.OK, MessageBoxIcon.Warning);
MessageBox.Show($"Você está há mais de {INACTIVITY_TIME} minutos inativo. O seu usuário será desconectado em {WARNING_TIME} minutos. Salve o seu trabalho.", "Aviso de inatividade", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
90 changes: 90 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# PC Timer Off

**PC Timer Off** é um software projetado para desligar automaticamente computadores que permanecem inativos por um período configurável. Ideal para economizar energia, otimizar recursos e reduzir custos operacionais.

[➡ Download da versão mais recente](https://github.com/josejefferson/pc-timer-off/releases/latest)

## Instruções de uso

### Instalação

Acesse a aba "Releases" e baixe a versão mais recente

[➡ Download da versão mais recente](https://github.com/josejefferson/pc-timer-off/releases/latest)

Abra o instalador e siga as instruções

### Requisitos

- Windows 7 ou superior
- 32 ou 64 bits

> [!IMPORTANT]
> Se você utilizar o **Windows 7**, é necessário instalar o [Microsoft Visual C++ 2015-2019 Redistributable](https://learn.microsoft.com/pt-br/cpp/windows/latest-supported-vc-redist?view=msvc-170) e a atualização [KB3063858](https://learn.microsoft.com/pt-br/cpp/windows/latest-supported-vc-redist?view=msvc-170)\
> Caso utilize o **Windows 8.1**, instale o [Microsoft Visual C++ 2015-2019 Redistributable](https://learn.microsoft.com/pt-br/cpp/windows/latest-supported-vc-redist?view=msvc-170)
### Personalizar tempos de inatividade

Por enquanto não há uma interface gráfica para personalizar os tempos de inatividade. Para configurá-los é necessário editar o registro do Windows.

Abra o Prompt de Comando (`cmd.exe`) como administrador e execute os comandos abaixo de acordo com a arquitetura do seu sistema operacional, modificando os números no final do comando de acordo com a sua preferência.

```bat
:: --- WINDOWS 64 BITS ---
:: Tempo de inatividade para exibir o aviso de desconexão (em minutos)
reg add "HKLM\SOFTWARE\WOW6432Node\PCTimerOff" /v InactivityTime /t REG_DWORD /d 60 /f
:: Tempo após o aviso de desconexão para deslogar o usuário (em minutos)
reg add "HKLM\SOFTWARE\WOW6432Node\PCTimerOff" /v WarningTime /t REG_DWORD /d 5 /f
:: Tempo após o último usuário desconectar para desligar o computador (em minutos)
reg add "HKLM\SOFTWARE\WOW6432Node\PCTimerOff" /v ShutdownTime /t REG_DWORD /d 10 /f
:: --- WINDOWS 32 BITS ---
:: Tempo de inatividade para exibir o aviso de desconexão (em minutos)
reg add "HKLM\SOFTWARE\PCTimerOff" /v InactivityTime /t REG_DWORD /d 60 /f
:: Tempo após o aviso de desconexão para deslogar o usuário (em minutos)
reg add "HKLM\SOFTWARE\PCTimerOff" /v WarningTime /t REG_DWORD /d 5 /f
:: Tempo após o último usuário desconectar para desligar o computador (em minutos)
reg add "HKLM\SOFTWARE\PCTimerOff" /v ShutdownTime /t REG_DWORD /d 10 /f
```

> [!NOTE]
> Para aplicar as alterações, é necessário reiniciar o computador.
### Instalação silenciosa

```bat
PCTimerOff.exe /verysilent /norestart
```

## Como funciona

O projeto é composto por dois executáveis: `Logoff Timer.exe` e `Shutdown Timer.exe`, cada um com funções específicas no ambiente em que são executados.

### `Logoff Timer.exe` (Executado no ambiente de cada usuário)

Este executável é iniciado individualmente para cada usuário logado no computador. Ele monitora o tempo de inatividade do usuário e, quando o tempo configurado é ultrapassado:

1. Exibe um aviso na tela informando que o usuário será desconectado.
2. Após um período adicional configurável, o usuário é automaticamente deslogado.

![Logoff Timer](https://github.com/user-attachments/assets/99597a6e-3510-4843-80d6-375fd45f4a4f)

### `Shutdown Timer.exe` (Executado no ambiente do sistema)

Este executável opera em nível de sistema, monitorando a quantidade de usuários logados no computador. Quando não há mais usuários ativos:

1. Inicia um temporizador para desligar o computador após o tempo configurado.
2. Caso um novo login seja realizado antes do término do temporizador, ele é automaticamente cancelado.

![Shutdown Timer](https://github.com/user-attachments/assets/7866a1ae-7500-4473-a82e-0d21c825b47a)

## Tecnologias utilizadas

![Windows](https://img.shields.io/badge/Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white)
![C#](https://img.shields.io/badge/c%23-%23239120.svg?style=for-the-badge&logo=csharp&logoColor=white)
![.Net](https://img.shields.io/badge/.NET-5C2D91?style=for-the-badge&logo=.net&logoColor=white)
![Visual Studio](https://img.shields.io/badge/Visual%20Studio-5C2D91.svg?style=for-the-badge&logo=visual-studio&logoColor=white)
![Inno Setup](https://img.shields.io/badge/Inno%20Setup-005799.svg?style=for-the-badge&logo=inno-setup&logoColor=white)
22 changes: 11 additions & 11 deletions Shutdown Timer/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,33 @@ internal static class Program
[STAThread]
static void Main()
{
// Aguarda até que todas as sessões ativas sejam encerradas
// Aguarda até que todas as sessões ativas sejam encerradas
while (true)
{
Debug.WriteLine($"\n{GetSessionCount()} usuários logados neste computador:");
Debug.WriteLine($"\n{GetSessionCount()} usuários logados neste computador:");

// Exibe os usuários logados
// Exibe os usuários logados
foreach (var session in GetSessions())
{
Debug.WriteLine($" - {session.UserAccount}");
}

// Se não houver sessões ativas, inicia o timer de desligamento
// Se não houver sessões ativas, inicia o timer de desligamento
if (GetSessionCount() == 0)
{
Debug.WriteLine($"Desligando o computador em {SHUTDOWN_TIME} minutos...");

// Tempo que o computador está sem sessões ativas
// Tempo que o computador está sem sessões ativas
long timeStart = DateTimeOffset.UtcNow.ToUnixTimeSeconds();

while (true)
{
long currentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();

// Se algum usuário fizer login, cancela o desligamento
// Se algum usuário fizer login, cancela o desligamento
if (GetSessionCount() > 0)
{
Debug.WriteLine($"Usuário fez login, cancelando o desligamento...");
Debug.WriteLine($"Usuário fez login, cancelando o desligamento...");
break;
}

Expand All @@ -60,7 +60,7 @@ static void Main()
}

/// <summary>
/// Retorna as sessões ativas no computador (ou seja, os usuários logados)
/// Retorna as sessões ativas no computador (ou seja, os usuários logados)
/// </summary>
static List<ITerminalServicesSession> GetSessions()
{
Expand All @@ -70,17 +70,17 @@ static List<ITerminalServicesSession> GetSessions()

server.Open();

// Todas as sessões ativas no computador
// Todas as sessões ativas no computador
var allSessions = server.GetSessions();

// Filtra as sessões que não estão nulas
// Filtra as sessões que não estão nulas
var notNullSessions = allSessions.Where(session => session.UserAccount != null).ToList();

return notNullSessions;
}

/// <summary>
/// Retorna a quantidade de sessões ativas no computador
/// Retorna a quantidade de sessões ativas no computador
/// </summary>
static int GetSessionCount()
{
Expand Down

0 comments on commit b0c7a8f

Please sign in to comment.