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.