C#  - Agendando Tarefas no Windows


 Neste artigo eu vou mostrar como podemos agendar e deletar tarefas usando o Task Manager do Windows em uma aplicação Windows Forms com a linguagem C#.

O Agendador de tarefas (Task Manager) do Windows permite agendar qualquer tarefa a ser executada no período de tempo programado. Podemos programar o tempo para executar a tarefa de forma que ela seja acionada em um tempo determinado.

Se quisermos usar a funcionalidade de agendar tarefas em nossa aplicação .Net, então podemos usar a windows.dll para que possamos personalizar a interface de usuário padrão. Para criar aplicações com estes recursos podemos usar o arquivo "taskschd.dll" do sistema operacional do Windows.

Existem alguns pontos que temos que considerar quando vamos realizar o agendamento de uma tarefa em nossa aplicação:

Neste artigo eu vou mostrar como podemos criar e deletar uma tarefa incluindo-a no agendador de tarefas do Windows. Como exemplo eu vou agendar a tarefa para abrir o MS Paint.

Recursos Usados :

Criando o projeto no Visual Studio 2013 Express for Windows Desktop

Abra o VS Express 2013 for Windows Desktop e clique em New Project;

A seguir selecione a linguagem Visual C# e o template Windows Forms Application;

Informe o nome AgendarTarefa e clique no botão OK;

A seguir selecione o  formulário padrão form1.vb e altere o seu nome para frmAgendarTarefa e inclua, a partir da ToolBox, os seguintes controles no formulário:

Disponha os controles no formulário conforme a figura abaixo:

Não esqueça de incluir uma referência a dll TaskScheduler.dll no projeto.

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

TaskScheduler oAgendador;

//Para tratar a definição da tarefa

ITaskDefinition oDefinicaoTarefa;

//Para tratar a informação do Trigger

ITimeTrigger oTrigger;

//Para tratar a informação da Ação

IExecAction oAcao;

No evento Click do botão btnCriarTarefa inclua o código abaixo:

 private void btnCriarTarefa_Click(object sender, EventArgs e)
        {
            try
            {
                oAgendador = new TaskScheduler();
                oAgendador.Connect();
                //Atribuindo Definição de tarefa
                AtribuiDefinicaoTarefa();
                //Definindo a informação do gatilho da tarefa
                DefineInformacaoGatilho();
                //Definindo a informção da ação da tarefa
                DefineInformacaoAcao();
                //Obtendo a pasta raiz
                ITaskFolder root = oAgendador.GetFolder("\\");
                //Registrando a tarefa , se a tarefa ja estiver registrada então ela será atualizada
                IRegisteredTask regTask = root.RegisterTaskDefinition("_Macoratti_Tarefa", oDefinicaoTarefa, (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE,
 null, null, _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, "");
                //Para executar a tarefa imediatamente chamamos o método Run()
                IRunningTask runtask = regTask.Run(null);
                //exibe mensagem
                MessageBox.Show("Tarefa foi criada com sucesso","Criar Tarefa",MessageBoxButtons.OK,MessageBoxIcon.Information); 
            }
            catch (Exception ex )
            {
                //exibe erros
                MessageBox.Show(ex.Message);
            }
        }

A seguir temos o código das rotinas que contém o comentário explicando passo a passo cada linha de código:

1- AtribuiDefinicaoTarefa

       //Atribuição da da Definição da tarefa
        private void AtribuiDefinicaoTarefa()
        {
            try
            {
                 oDefinicaoTarefa = oAgendador.NewTask(0);
                //Registra informação para a tarefa
                //nome do autor da tarefa
                oDefinicaoTarefa.RegistrationInfo.Author = "Macoratti";
                //descrição da tarefa
                oDefinicaoTarefa.RegistrationInfo.Description = "_Macoratti_Tarefa";
                //Registro da data da tarefa
                oDefinicaoTarefa.RegistrationInfo.Date = DateTime.Today.ToString("yyyy-MM-ddTHH:mm:ss"); //formatacao
                //Definição da tarefa
                //Prioridade da Thread
                oDefinicaoTarefa.Settings.Priority = 7;
                //Habilita a tarefa
                oDefinicaoTarefa.Settings.Enabled =true ;
                //Para ocultar/exibir a tarefa
                oDefinicaoTarefa.Settings.Hidden = false;
                //Tempo de execução limite para a tarefa
                oDefinicaoTarefa.Settings.ExecutionTimeLimit = "PT10M"; //10 minutos
                //Define que não precisa de conexão de rede
                oDefinicaoTarefa.Settings.RunOnlyIfNetworkAvailable = false ;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

2 - Rotina DefineInformacaoGatilho

        //Definindo a informação do Gatilho (Trigger)
        private void DefineInformacaoGatilho()
        {
            try
            {
                //informação do gatilho baseada no tempo - TASK_TRIGGER_TIME
                oTrigger = (ITimeTrigger)oDefinicaoTarefa.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME);                                  //ID do Trigger
                oTrigger.Id ="Trigger_Da_Tarefa";
                                                                                                                                                                                                                            
                //hora de inicio
                oTrigger.StartBoundary = "2014-01-09T10:10:00"; //yyyy-MM-ddTHH:mm:ss
                //hora de encerramento
                oTrigger.EndBoundary = "2016-01-01T07:30:00"; //yyyy-MM-ddTHH:mm:ss
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

3- Rotina DefineInformacaoAcao()

       //Define a informação da Ação da tarefa
        private void DefineInformacaoAcao()
        {
            try
            {
                //Informação da Ação baseada no exe- TASK_ACTION_EXEC
               oAcao=(IExecAction)oDefinicaoTarefa.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);                                                 
                //ID da Ação
                oAcao.Id = "testeAcao1";
                //Define o caminho do arquivo EXE a executar (Vamos abrir o Paint)                                                                                 
                oAcao.Path = "mspaint";
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

Para deletar uma tarefa criada usamos o código a seguir no evento Click do botão de comando btnDeletar informando o nome da tarefa a ser deletada :

private void btnDeletar_Click(object sender, EventArgs e)
        {
            try
            {
                //cria instância do agendador
                TaskScheduler oAgendador = new TaskScheduler();
                oAgendador.Connect();

                //define a pasta raiz
                ITaskFolder containingFolder = oAgendador.GetFolder("\\");
                //Deleta a tarefa
                containingFolder.DeleteTask("_Macoratti_Tarefa", 0);  //da o nome da tarefa que foi criada
                MessageBox.Show("Tarefa Deletada...");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message,"Deletar Tarefa",MessageBoxButtons.OK,MessageBoxIcon.Information);
            }
        }

Executando o projeto e clicando no botão Criar Tarefa iremos obter o resultado abaixo onde vemos o MSPaint iniciado:

Para ver a tarefa agendada no Task Manager faça o seguinte: (O procedimento é válido para o Windows 7)

Você deverá visualizar a janela do Agendador de Tarefas e identificar a tarefa _Macoratti_Tarefa conforme figura a seguir:

Pegue o projeto completo aqui: AgendarTarefa.zip

Lucas 8:20 E foi-lhe dito: Estão lá fora tua mãe e teus irmãos, que querem ver-te,
Lucas 8:21
Mas, respondendo ele (Jesus), disse-lhes: Minha mãe e meus irmãos são aqueles que ouvem a palavra de Deus e a executam.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti