Abbiamo sempre detto che il Framework seppur completo è sempre in qualche modo "parziale", ossia non tutte le funzionalità di Windows sono state "wrappate"/migrate. In particolare le API che sono nell'ordine delle migliaia non sono tutte accessibili utilizzando le classi managed di .NET.
Dobbiamo quindi dare uno sguardo al passato ed utilizzare le API di Win32 utilizzando l'interoperabilità, il namespace
System.Runtime.InteropServices.
Proprio in questo Tip faremo ricorso all'interoperabilità per andare a modificare l'ora del sistema.
E'necessario prima di tutto importare il nostro namespace e successivamente definira la struttura
SYSTEMTIME in questo modo:
Public Structure SYSTEMTIME
Public wYear As UInt16
Public wMonth As UInt16
Public wDayOfWeek As UInt16
Public wDay As UInt16
Public wHour As UInt16
Public wMinute As UInt16
Public wSecond As UInt16
Public wMilliseconds As UInt16
End Structure
Ci servono inoltre due funzioni:
- GetSystemTime
- SetSystemTimeche andremo a definire di seguito:
<DllImport("kernel32.dll")> _
Public Shared Sub GetSystemTime(ByRef lpSystemTime As SYSTEMTIME)
End Sub
<DllImport("kernel32.dll")> _
Public Shared Function SetSystemTime(ByRef lpSystemTime As SYSTEMTIME) As UInt32
End Function
A questo punto passiamo al codice vero e proprio.
Le due funzioni qui sopra definite svolgono la banale funzione di recuperare l'ora di sistema la prima e impostare una nuova ora di sistema la seconda.
La procedura quindi sarà:
- Definire una variabile/struttura di tipo
SYSTEMTIME- Recuperare l'ora riempiendo la struttura con la funzione
GetSystemTime- Modificare la struttura e quindi l'ora
- Riapplicare l'orario nuovo con la
SetSystemTimeEcco il codice:
VB.NET'Inizializzazione Struttura
Dim ora As New SYSTEMTIME
'Recuperiamo l'ora corrente
GetSystemTime(ora)
'Modifichiamo i minuti a 45
ora.wMinute = UInt16.Parse("45")
'Riapplichiamo la nuova ora
SetSystemTime(ora)
In pochi semplici passi siamo riusciti ad ottenere un risultato egregio. Alcune volte ho trovato domande di questo tipo nel newsgroup o nei forum proprio perchè qualcuno voleva gestire automaticamente per esempio il cambio di ora legale o per altre ragioni. Personalmente non ho mai sentito la necessità di modificare via codice l'ora, ma se qualcuno ne avesse bisogno, ecco qua la soluzione!
Grazie a Giovanni Ferron per lo spunto per questo Tip.