2010-05-05 6 views
9

Y at-il une API Windows qui équivaudrait à cliquer sur le bouton "Mettre à jour maintenant" dans l'onglet "Propriétés de date et heure"/"Heure Internet" (ouvert en double-cliquant sur l'horloge la barre des tâches)?Windows API pour déclencher la synchronisation horaire

Y at-il un moyen de surveiller quand la synchronisation de l'heure est déclenchée par Windows et quand elle réussit ou échoue?

Répondre

7

Aucune API n'est exposée par le service de temps, mais pour déclencher une synchronisation horaire, vous pouvez utiliser l'outil de ligne de commande w32tm.

en C/C++, vous pouvez faire quelque chose comme ceci:

include <process.h> 

... 

system("w32tm /resync /nowait"); 

Jetez un oeil à w32tm documentation pour d'autres options.

+0

Pas exactement ce dont j'avais besoin, mais mieux que rien. Merci! –

+0

Merci un million! –

1

Cela semble fonctionner:

using System; 
using System.Runtime.InteropServices; 

namespace ClockResync 
{ 
    class Program 
    { 
     [DllImport("w32time.dll")] 
     public static extern uint W32TimeSyncNow([MarshalAs(UnmanagedType.LPWStr)]String computername, bool wait, uint flag); 
     static void Main(string[] args) 
     { 
      Console.WriteLine(W32TimeSyncNow("computername", true, 8).ToString()); 
      Console.ReadLine(); 
     } 
    } 
} 

Il est en situation irrégulière, donc je ne sais pas exactement ce que les drapeaux sont possibles, mais 8 semble faire le travail très bien - testé avec mon horloge système. Si vous exécutez Windows 64 bits, compilez pour 64 bits ou vous obtiendrez des exceptions de violation d'accès.

W32TimeQueryStatus devrait être en mesure d'obtenir la dernière heure de synchronisation réussie. Je vais y travailler quand j'ai plus de temps.