hATEmATH的网上田园

喂马 劈柴 做一个幸福的人
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456
公告
  • ◇ 欢迎来到这里的每一位朋友。

    ◇ 无需注册即可评论或留言。

    ◇ 文章无"转载(ZT)"字样均为原创。

    ◇ "随笔分类"中包含我的所有随笔

留言簿(13)

随笔分类

随笔档案

文章分类

文章档案

相册

工具网站

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-120 文章-20 评论-434 Trackbacks-0


(本文适合初学者)

转载请注明出处:HateMath的网上田园(http://blog.vckbase.com/hatemath/)

前言:
        一日,编程急需XP下调整系统时间的代码。最初想上网找吧,省事点,不料诺大一个internet,找个现成的代码居然如此困难(按理说应该有,不过我确实没找到)。只好自己写了,而且在这里贴出来,以便节省大家的时间。

正文:
在Win2000中,调整系统时间很eazy,只要运用如下代码即可。
SYSTEMTIME st;
GetSystemTime(&st);       // gets current time
st.wHour = hour;          // adjusts hours 
st.wMinute = minutes;     // and minutes

if (!SetSystemTime(&st))  // sets system time
{
     ..
}

可是在XP下,直接这样使用的话,你会发现这样做没效果。因为进程缺少相应的权限。这在MSDN中说的很清楚:

SetLocalTime
....
Remarks
The SetLocalTime function enables the SE_SYSTEMTIME_NAME privilege before changing the local time. This privilege is disabled by default.


        怎么办呢?其实很简单,XP下关机的代码你有没有?有,那只要把其中修改进程权限的地方稍加改动,把SE_SHUTDOWN_NAME改为SE_SYSTEMTIME_NAME 即可。(没有?看下面的代码,还不快记在小本本上 ^_^)

//XP下调整系统时间的演示
BOOL CSyncTimeDlg::SetSysTime()
{
   HANDLE hToken; 
   TOKEN_PRIVILEGES tkp; 

   
// Get a token for this process. 
   if (!OpenProcessToken(GetCurrentProcess(), 
        TOKEN_ADJUST_PRIVILEGES 
| TOKEN_QUERY, &hToken)) 
      
return( FALSE ); 

   
// Get the LUID for the shutdown privilege. 
   LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, //注意,改的就是它
        
&tkp.Privileges[0].Luid); 

   tkp.PrivilegeCount 
= 1;  // one privilege to set    
   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

   
// Get the shutdown privilege for this process. 
   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0
        (PTOKEN_PRIVILEGES)NULL, 
0); 

   
if (GetLastError() != ERROR_SUCCESS) 
      
return FALSE; 

    
//取得必要权限后,设置系统时间
    SYSTEMTIME systm;
    ::GetLocalTime(
&systm);    //得到当前的本地时间
    systm.wMonth += 1;        //作为演示,我们让月份和小时数加1
    systm.wHour += 1;

    
if(0 != ::SetLocalTime(&systm))
    
{
        
return TRUE;
    }

    
else
    
{
        
return FALSE;
    }



OK,就这样了。程序在VC6 + WindowsXP SP2 + IE6 下通过。
有什么疑问欢迎和我讨论,you can get me at : HateMath2005@163.com


posted on 2005-10-08 19:55 HateMath的网上田园 阅读(3347) 评论(9)  编辑 收藏
Comments
  • # re: 在WinXP下用VC调整系统时间
    周星星
    Posted @ 2005-10-09 08:30
    “没有?看下面的代码,还不快记在小本本上 ^_^)”
    --- 怎么跟杨老师语气一样?
  • # 怎么跟杨老师语气一样?
    flyingleaf
    Posted @ 2005-10-09 14:20
    哈哈 估计耳濡目染,不知不觉....
  • # re: 在WinXP下用VC调整系统时间
    guan
    Posted @ 2005-12-05 02:30
    请教:为什么我在XP进行时间调整,时分秒会乱掉。(2000系统下则正常)
  • # re: 在WinXP下用VC调整系统时间
    hateMath
    Posted @ 2005-12-06 13:32
    re: guan 

    呵呵,你这样问神仙也不知道如何回答啊.
    把你的代码发过来. HateMath2005@163.com
  • # re: 在WinXP下用VC调整系统时间
    muli
    Posted @ 2005-12-16 10:50
    谢谢
  • # re: 在WinXP下用VC调整系统时间
    SHT
    Posted @ 2006-06-05 19:53
      还是不明白 我的系统只要一重启就会回到原始日期 是怎么回事哦 
    能不能教我怎么做啊  我的QQ 253595427 
  • # re: SHT
    HateMath
    Posted @ 2006-06-06 10:50
    为了验证你的问题,我亲自试了一下,我的机子(winXP sp2 + IE6)上不存在这个问题。
    我怀疑你开启了XP的“时间同步”功能,或者是运行了内含时间同步功能的软件。

  • # re: 在WinXP下用VC调整系统时间
    sht
    Posted @ 2006-06-06 14:45
     我的时间同步根本就不能使用  反正一开机就会回复原状 让我一直很郁闷 每次开机要手动调整时间 
  • # re: 在WinXP下用VC调整系统时间
    HateMath的网上田园
    Posted @ 2006-06-07 19:45
    等会, 我先问问你所说的“回到原始日期“是什么意思?举个例子
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]