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 :
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#