SetLocalInfo修改系统时间后,必须重启机器才能生效。为了能够立即生效,需要广播一次消息,
使用SetLocaleInfo()函数设置完后,要使用PostMessage()函数(此API在USER32.dll中)向系统广播该消息:WM_SETTINGCHANGE,这样才能让系统重新读取注册表信息并更新!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace ConsoleApplication1
{
class Program
{
[DllImport("kernel32.dll", EntryPoint = "GetSystemDefaultLCID")]
public static extern int GetSystemDefaultLCID();
[DllImport("kernel32.dll", EntryPoint = "SetLocaleInfoA")]
public static extern int SetLocaleInfo(int Locale, int LCType, string lpLCData);
[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);
const int WM_SETTINGCHANGE = 0x001A;
const int HWND_BROADCAST = 0xffff;
public const int LOCALE_SSHORTDATE = 0x1F;
static void Main(string[] args)
{
DateTimeFormatInfo dtfi = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat;
string orginalFormatStr = dtfi.ShortDatePattern.ToString();
Console.WriteLine("Show default: " + dtfi.ShortDatePattern);
SetTimeFormat("yyyy/MMM/dd");
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
dtfi = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat;
Console.WriteLine("Show change: " + dtfi.ShortDatePattern);
SetTimeFormat(orginalFormatStr);
dtfi = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat;
Console.WriteLine("Show recovery: " + dtfi.ShortDatePattern);
Console.ReadLine();
}
public static void SetTimeFormat(string dateFormat)
{
try
{
int x = GetSystemDefaultLCID();
SetLocaleInfo(x, LOCALE_SSHORTDATE, dateFormat);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}