C# - Bloqueando o sistema usando o Timer


Neste artigo, vou mostrar como bloquear o sistema operacional Windows de forma automática usando o controle timer e a linguagem C#.

Geralmente quando você quer bloquear o seu computador (com Windows 7, Windows Vista) você usa a combinação de teclas CTRL+ALT+DEL e seleciona a opção "Bloquear o computador".

Veremos como você pode bloquear automaticamente o seu computador após um determinado período de tempo com a ajuda do controle Timer.

Na implementação vamos permitir que o usuário selecione após quando tempo ele deseja bloquear a máquina, definindo a unidade de tempo a partir de um formulário. E ao final do período o sistema será bloqueado.

É uma implementação bem simples e ingênua que mostra como usar o controle Timer e a API LockWorkStation da biblioteca User32.dll.

A API LockWorkStation trava a estação de trabalho e pode ser chamada apenas por processos em execução na área de trabalho interativa. Além disso, o usuário deve estar conectado, e a estação de trabalho não pode já estar bloqueada.

As razões mais comuns para que a estação de trabalho não possa ser bloqueada, mesmo se a função tiver êxito incluem o seguinte:

Esta função tem o mesmo resultado que pressionar Ctrl+Alt+Del e a seguir clicar em "Bloquear estação de trabalho". Para desbloquear a estação de trabalho, o usuário deve estar logado.

Não há função que você pode chamar para determinar se a estação de trabalho está bloqueada. Para receber uma notificação quando o usuário faz login, use a função WTSRegisterSessionNotification para receber mensagens WM_WTSSESSION_CHANGE. Você pode usar as notificações de sessão para controlar o estado do desktop para que você saiba se é possível interagir com o usuário.

Abra o Visual Studio 2012 Express for Destkop e clique em New Project;

Selecione a linguagem Visual C# e o template Windows Forms Application e o nome TravandoEstacaoTrabalho_CSharp;

No formulário form1.cs vamos incluir os seguintes controles:

Define o leiaute dos controles no formulário conforme a figura abaixo:

Vamos declarar os namespaces usados :

using System;
using System.Windows.Forms;
using System.Diagnostics;

No início do formulário vamos definir as variáveis que iremos usar no projeto:

//definido 1 Segundo (1000 Milisegundos)
int fatorMultiplacacao = 1;
int intervalo = -1;

No construtor do formulário form1 vamos definir o código que seleciona o primeiro item da combobox e põe o foco no controle numericupdown - nupd1.

 public Form1()
 {
      InitializeComponent();
      cboUnidadeTempo.SelectedItem = cboUnidadeTempo.Items[0];
      nupd1.Focus();
}

No evento SelectedIndexChanged da combobox definimos o fator de multiplicação conforme a seleção do usuário:

    private void cboUnidadeTempo_SelectedIndexChanged(object sender, EventArgs e)
        {
            string unidadeTempo = cboUnidadeTempo.SelectedItem.ToString();

            switch (unidadeTempo)
            {
                case "Segundo(s)":

                    // Inicializado com 1 Segundo (1000 Milisegundos)
                    fatorMultiplacacao = 1000;
                    break;

                case "Minuto(s)":

                    // Inicializado com 1 Minuto (60 * 1000 Milisegundos)
                    fatorMultiplacacao = 60 * 1000;
                    break;

                case "Hora(s)":

                    // Inicializado com 1 Hora (60 * 60 * 1000 Milisegundos)
                    fatorMultiplacacao = 60 * 60 * 1000;
                    break;

                case "Dia(s)":

                    // Inicializado com 1 Dia (24 * 60 * 60 * 1000 Milisegundos)
                    fatorMultiplacacao = 24 * 60 * 60 * 1000;
                    break;
            }
        }

No evento Click do botão Ativar Bloqueio obtemos o valor informando e usando o fator de multiplicação para definir o intervalo de tempo e assim calcular quando o bloqueio será realizado.

Estamos instanciando um objeto Timer , definindo a propriedade Interval e acionando o evento Tick do controle:

Obs: O evento Tick ocorre quando o intervalo do timer especificado tiver decorrido e o timer está ativado.

private void btnBloquear_Click(object sender, EventArgs e)
        {
            int _resultado = -1;
            if (int.TryParse(nupd1.Text, out _resultado) && _resultado > 0)
            {
                intervalo = _resultado * fatorMultiplacacao;

                Timer _tmr = new Timer();
                _tmr.Interval = intervalo;
                _tmr.Tick += new EventHandler(tmr_Tick);
                this.UseWaitCursor = true;
                _tmr.Start();
            }
            else
            {
                MessageBox.Show("Informe um valor positivo.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                nupd1.Focus();
            }
        }

No evento Tick estamos usando a API LockWorkStation da biblioteca API User32 e através da classe ProcessStartInfo especificando os valores para iniciar o bloqueio:

   void tmr_Tick(object sender, EventArgs e)
        {
            string _nomeArquivo = "Rundll32.exe";
            string _argumentos = "User32.dll, LockWorkStation";
            ProcessStartInfo _inicioInfo = new ProcessStartInfo(_nomeArquivo, _argumentos);
            Process.Start(_inicioInfo);
            this.Close();
        }

Abaixo vemos a aplicação em execução onde o usuário define o intervalo de tempo para realizar o bloqueio:

Podemos também criar um atalho na área de trabalho para bloquear a estação da seguinte forma:

Criando um atalho na estação de trabalho para bloquear a estação :
  • Vá para a pasta C: \ Documents and Settings\%username%\ Dados de aplicativos Internet Explorer\ Microsoft\Quick Launch.
  • Clique com Botão direito do mouse no painel direito e a seguir clique em Novo -> Atalho.
  • Informe (sem as aspas): "rundll32.exe user32.dll, LockWorkStation ".
  • Digite o seguinte nome para este atalho: "Bloquear estação de trabalho".
Agora basta clicar sobre o atalho e seu computador será bloqueado. 

Uma outra forma de obter o resultado via código e usar a classe Process.Start e definir o caminho da biblioteca e o nome da API como parâmetros:

static void Main(string[] args)   
{   
    Process.Start(@"C:\WINDOWS\system32\rundll32.exe", "user32.dll,LockWorkStation") ;    
}

Pegue o projeto completo aqui :  TravandoEstacaoTrabalho_CSharp.zip

Joã 3:35 O Pai ama ao Filho, e todas as coisas entregou nas suas mãos.

Joã 3:36 Quem crê no Filho tem a vida eterna; o que, porém, desobedece ao Filho não verá a vida, mas sobre ele permanece a ira de Deus.

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti