场景
SpringBoot/Java中定时请求并根据服务端响应头的date实现本地Windows修改时间/时间同步(管理员权限问题-bat管理员启动cmd并运行jar):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130720097
参考以上在java中实现修改window的系统时间的方式。
如何在Winform中实现修改系统时间。
首先winform中通过调用Windows的Kernel32 DLL的方式修改时间会更方便,
其次winform实现修改时间也需要获取管理员权限,所以让winform在启动时就提示以
管理员模式运行。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
实现
1、修改Winform启动时以管理员模式启动程序
修改Program.cs的main方法
static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] Args) { Application.SetCompatibleTextRenderingDefault(false); System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent(); System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity); //判断当前登录用户是否为管理员 if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)) { //如果是管理员,则直接运行 Application.EnableVisualStyles(); Application.Run(new Form1()); } else { //创建启动对象 System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); //设置运行文件 startInfo.FileName = Application.ExecutablePath; //设置启动参数 startInfo.Arguments = String.Join(" ", Args); //设置启动动作,确保以管理员身份运行 startInfo.Verb = "runas"; //如果不是管理员,则启动UAC System.Diagnostics.Process.Start(startInfo); //退出 Application.Exit(); } } }
2、新建调用Kernel32.dll的工具类Forproc_Win32.cs
namespace adminModifySystemTime { public struct 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; /// <summary> /// 从System.DateTime转换。 /// </summary> /// <param name="time">System.DateTime类型的时间。</param> public void FromDateTime(DateTime time) { wYear = (ushort)time.Year; wMonth = (ushort)time.Month; wDayOfWeek = (ushort)time.DayOfWeek; wDay = (ushort)time.Day; wHour = (ushort)time.Hour; wMinute = (ushort)time.Minute; wSecond = (ushort)time.Second; wMilliseconds = (ushort)time.Millisecond; } /// <summary> /// 转换为System.DateTime类型。 /// </summary> /// <returns></returns> public DateTime ToDateTime() { return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds); } /// <summary> /// 静态方法。转换为System.DateTime类型。 /// </summary> /// <param name="time">SYSTEMTIME类型的时间。</param> /// <returns></returns> public static DateTime ToDateTime(SYSTEMTIME time) { return time.ToDateTime(); } } public class Win32API { [DllImport("Kernel32.dll")] public static extern bool SetLocalTime( ref SYSTEMTIME Time ); [DllImport("Kernel32.dll")] public static extern void GetLocalTime(ref SYSTEMTIME Time); } }
3、添加一个按钮并修改按钮点击事件,每次点击修改当前时间加一小时
private void button1_Click(object sender, EventArgs e) { //取得当前系统时间 DateTime t = DateTime.Now; //在当前时间上加上1小时 t = t.AddHours(1); //转换System.DateTime到SYSTEMTIME SYSTEMTIME st = new SYSTEMTIME(); st.FromDateTime(t); //调用Win32 API设置系统时间 Win32API.SetLocalTime(ref st); //显示当前时间 MessageBox.Show(DateTime.Now.ToString()); }
4、实现效果