2011-05-21 11 views

Respuesta

10

Necesitará P/Invocar el SetLocalTime function de la API de Windows. Declararlo así en C#:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
internal static extern bool SetLocalTime(ref SYSTEMTIME lpSystemTime); 

[StructLayout(LayoutKind.Sequential)] 
internal struct SYSTEMTIME 
{ 
    public ushort wYear; 
    public ushort wMonth; 
    public ushort wDayOfWeek; // ignored for the SetLocalTime function 
    public ushort wDay; 
    public ushort wHour; 
    public ushort wMinute; 
    public ushort wSecond; 
    public ushort wMilliseconds; 
} 

Para ajustar la hora, sólo tiene que inicializar una instancia de la estructura SYSTEMTIME con los valores apropiados, y llama a la función. Código de ejemplo:

SYSTEMTIME time = new SYSTEMTIME(); 
time.wDay = 1; 
time.wMonth = 5; 
time.wYear = 2011; 
time.wHour = 12; 
time.wMinute = 15; 

if (!SetLocalTime(ref time)) 
{ 
    // The native function call failed, so throw an exception 
    throw new Win32Exception(Marshal.GetLastWin32Error()); 
} 

Sin embargo, cabe destacar que el proceso de llamada debe tener los privilegios apropiados con el fin de llamar a esta función. En Windows Vista y posterior, esto significa que tendrá que solicitar la elevación del proceso.


Como alternativa, puede utilizar el SetSystemTime function, lo que le permite establecer la hora en UTC (Tiempo Universal Coordinado). Se utiliza la misma estructura SYSTEMTIME, y las dos funciones se llaman de forma idéntica.

6

.NET no expone una función para eso, pero puede usar el método Win32 API SetSystemTime (en kernel32.dll). Para obtener la hora UTC, debe usar un NTP Protocol Client y luego ajustar esa hora a la hora local de acuerdo con sus configuraciones regionales.

public struct SYSTEMTIME 
{  
    public ushort wYear,wMonth,wDayOfWeek,wDay,wHour,wMinute,wSecond,wMilliseconds; 
} 

[DllImport("kernel32.dll")] 
public extern static uint SetSystemTime(ref SYSTEMTIME lpSystemTime); 

SYSTEMTIME systime = new SYSTEMTIME(); 
systime = ... // Set the UTC time here 
SetSystemTime(ref systime); 
+0

Incorrecto. Esto es para Compact Framework, bajo Windows Mobile. La pregunta está etiquetada como "windows-xp". –

+0

Ups, tienes razón. Corrigiéndolo ahora. –

0

Para evitar el problema del privilegio SE_SYSTEMTIME_NAME, intente crear una tarea programada para ejecutar su aplicación y habilite "Ejecutar con los privilegios más altos".

Cuestiones relacionadas