09 Dez, 2009 12:58

Agendamento de programas em Windows Mobile

Esse agendamento pode ser extremamente útil para o caso de você estar implementando um despertador, ou algo que de tempos em tempos verifique um estado para saber se o usuário deve ser notificado ou não, ou até executar um outro programa paralelo ao seu, rodando em background, enquanto o seu roda em primeiro plano. Neste link há um vídeo explicando como fazer. Se você não está muito a fim de assistir o vídeo em inglês, pode acompanhar por aqui.

Primeiro, baixe este arquivo e adicione ele ao seu projeto. Veja o que ele tem:

public class Scheduler {
    [DllImport("CoreDLL.dll")]
    public static extern int CeRunAppAtTime(string application, SystemTime startTime);

    [DllImport("CoreDLL.dll")]
    public static extern int FileTimeToSystemTime(ref long lpFileTime, SystemTime lpSystemTime);

    [DllImport("CoreDLL.dll")]
    public static extern int FileTimeToLocalFileTime(ref long lpFileTime, ref long lpLocalFileTime);
}

Para você que não está habituado com código nativo importado através de DLL, temos três métodos nessa classe, sendo que o principal é o primeiro:

[DllImport("CoreDLL.dll")]
public static extern int CeRunAppAtTime(string application, SystemTime startTime);

Basta chamar esse método, passando para ele o endereço da aplicação e a data no formato SystemTime. Essa classe está declarada dentro do arquivo, dessa forma:

[StructLayout(LayoutKind.Sequential)]
public class SystemTime {
    public ushort wYear;
    public ushort wMonth;
    public ushort wDayOfWeek;
    public ushort wDay;
    public ushort wHour;
    public ushort wMinute;
    public ushort wSecond;
    public ushort wMilliseconds;
}

Isso explica os outros métodos auxiliares da classe Scheduler. Ambos são usados para traduzir a data de DateTime para SystemTime. Mas, se você estiver utilizando nosso código, vai ver que há mais um método:

public static void AgendarDownload(string aplicativo, DateTime quando) {
    long fileStartTime = quando.ToFileTime();
    //convertendo de DateTime para SystemTime
    long localFileStartTime = 0;
    Scheduler.FileTimeToLocalFileTime(ref fileStartTime, ref localFileStartTime);
    SystemTime systemStartTime = new SystemTime();
    Scheduler.FileTimeToSystemTime(ref localFileStartTime, systemStartTime);

    //chamando o método nativo
    Scheduler.CeRunAppAtTime(aplicativo, systemStartTime);
}

E pronto! Com esse método estático, você pode chamar o Scheduler. Veja o exemplo abaixo, onde eu chamo o IE para ser executado cinco minutos depois:

static void Main(string[] args) {
        DateTime dataAgendamento = DateTime.Now + new TimeSpan(0, 5, 0);
        Scheduler.AgendarDownload(@"\Windows\iexplore.exe", dataAgendamento);
}

Em nossos testes, o código funcionou perfeitamente, tanto no Windows Mobile Professional quanto no Standard (se você não sabe a diferença entre eles, veja neste link). Testamos agendar para um horário em que o aparelho estivesse desligado, e o programa rodou assim que o Windows foi iniciado. Lembre-se que o aplicativo não tem nenhuma ligação com o que o agendou inicialmente; isso significa que se este for fechado, não influenciará na execução daquele.

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.