50分:怎样编程实现禁止用户更改系统时间?

电脑右下角双击时间或右键点时间选“调整日期/时间”就会弹出“日期和时间属性”对话框,怎样编程实现不让对话框弹出来呢?最好用VC++实现。
在“控制面板-》管理工具-》本地安全策略-》用户权利指派”里的“更改系统时间”可以指派给用户相应的权限,这里是可以通过更改权限禁止用户更改系统时间,但不知有没有办法用编程的方式实现这个权限的更改,注册表里可以更改吗?
我用MSVC++建了一个工程,主要是想捕获WM_TIMECHANGE消息,然后恢复系统时间,工程添加部分如下:

//成员变量:
SYSTEMTIME oldTime;

//初始化:
this->SetTimer(1, 1000, NULL);

//定时器函数:
void CMainFrame::OnTimer(UINT nIDEvent)
{
::GetLocalTime( &oldTime ); //记录系统时间

CFrameWnd::OnTimer(nIDEvent);
}

//消息截获函数:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// 时间改变且不是本程序修改的
if ( ( pMsg->message == WM_TIMECHANGE ) && ( pMsg->hwnd != this->m_hWnd ) )
{
::SetLocalTime( &oldTime ); //恢复原来时间
}

return CFrameWnd::PreTranslateMessage(pMsg);
}

这样可以做到不让用户更改系统时间的目的,但出现了一个问题,就是用户一更改时间后(时间当然被这个程序恢复过来了)系统其他进程会占用较多的CPU资源,特别是EXPLORER.EXE占用50%左右的CPU资源,这个程序占用5%左右CPU资源,然后这个程序动不了了,在任务管理器里结束这个程序后,CPU占用就恢复正常了,这是怎么回事啊??

当任何程序或用户修改系统时间的时候,系统会将 WM_TIMECHANGE 消息到所有的进程,我们的程序可以捕获到该消息,然后将系统时间恢复到修改前的状态,这样就可以在我们的程序运行时系统时间的正确性,代码如下:

'窗体form1(需要一个timer控件,interval=1000):

Private Sub Form_Load()
Timer1_Timer
RegisterWindow Me.hwnd '为窗口设置子类
End Sub

Private Sub Form_Unload(Cancel As Integer)
unRegisterWindow Me.hwnd '取消窗口的子类
End Sub

Private Sub Timer1_Timer()
OldTime = Now
End Sub

'模块modle1:

Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Public OldTime As String
Public ChangeFlag As Boolean
Public Const WM_TIMECHANGE As Long = &H1E '当系统的时间变化时发送此消息给所有顶级窗口
Public oldproc As Long
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Declare Function SetLocalTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) As Long

Public Function RegisterWindow(hwnd As Long) As Long
If hwnd <> 0 Then
oldproc = SetWindowLong(hwnd, -4, AddressOf WinProc)
End If
End Function
Public Function unRegisterWindow(hwnd As Long) As Long

If hwnd <> 0 Then
SetWindowLong hwnd, -4, oldproc
End If

End Function
Public Function WinProc(ByVal hwnd As Long, ByVal msg As Long, ByVal lpara As Long, ByVal wpara As Long) As Long

Dim i, mytt

If msg = WM_TIMECHANGE And ChangeFlag = False Then '系统时间被修改了而且不是本程序修改的

ChangeFlag = True '本程序要修改系统时间

Call SetToOldTime '修改系统时间

Exit Function

End If

ChangeFlag = False

WinProc = CallWindowProc(oldproc, hwnd, msg, lpara, wpara)

End Function
Public Function SetToOldTime() As String '将时间恢复到设置前的状态
Dim tmp As String
tmp = OldTime '从保存的时间中取出修改前的系统时间
Dim lpSystemTime As SYSTEMTIME
lpSystemTime.wYear = Year(tmp) '取出年份
lpSystemTime.wMonth = Month(tmp) '取出月份
lpSystemTime.wDayOfWeek = -1
lpSystemTime.wDay = Day(tmp) '取出日
lpSystemTime.wHour = Hour(tmp) '取出小时
lpSystemTime.wMinute = Minute(tmp) '取出分钟
lpSystemTime.wSecond = Second(tmp) '取出秒
lpSystemTime.wMilliseconds = 0
'set the new time
SetLocalTime lpSystemTime

End Function

'到此程序就完成了,运行一下试试

参考资料:参见CSDN

温馨提示:答案为网友推荐,仅供参考
第1个回答  2006-06-07
我是不懂编程的啊。

不知道安全策略改的是不是注册表,是的话就有个思路了。

你可以去下载个注册表监视器,然后改策略,看注册表哪里动了……

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网