求关机代码! - 蓝白E时代 - 阿根廷风暴 - Powered by Discuz!

来源:百度文库 编辑:神马文学网 时间:2024/07/02 19:42:07
关于用户权限(Privileges)的详细信息,可以参见MSDN

如何注销当前用户
可以使用ExitWindows或ExitWindowsEx函数注销当前用户。
在默认的情况下,当程序调用ExitWindows或ExitWindowsEx注销的时候,WM_QUERYENDSESSION消息也被发送到系统内的每个窗口。窗口所属的程序响应此消息并且返回TRUE表示可以被关闭,如果任意一个程序返回FALSE,注销操作将被取消。
Windows NT/2000以及后续版本:
当一个程序响应WM_QUERYENDSESSION并返回TRUE,那么它就会立刻接受到WM_ENDSESSION消息并马上结束,而不管其他的程序是怎么样回应WM_QUERYENDSESSION消息的。
Windows 95/98/Me:只有当系统内所有的程序都对WM_QUERYENDSESSION消息回应TRUE之后,他们才会一起接受到WM_ENDSESSION 消息,然后结束。
如果要强制关闭所有的程序,使用ExitWindowsEx函数,指定EXW_FORCE标志。如果这样做,系统不发送WM_QUERYENDSESSION 消息,而直接终止正在运行的程序。
在注销的时候,系统还向每一个进程发送CTRL_LOGOFF_EVENT 控制码。控制台程序可以注册一个HandlerRoutine例程来处理这个控制码(使用SetConsoleCtrlHandler函数)。(更多的关于控制台的控制码,参见MSDN里“HandlerRoutine”有关章节)
综上所述:只有所有的程序都允许退出,注销操作才能成功。如果某一个程序响应WM_QUERYENDSESSION并返回FALSE ,用户则不能被注销。这样就可以写出防止用户注销或关闭的程序(非强制情况)。

//这是注销当前用户的代码
ExitWindows(0, 0);
//响应WM_QUERYENDSESSION消息,如果在弹出消息框里选择NO,则取消注销。
case WM_QUERYENDSESSION:

{
int r;
r = MessageBox(NULL, "Shut down?","WM_QUERYENDSESSION", MB_YESNO);
// Return TRUE to allow shutdown, FALSE to stop.
return r == IDYES;
break;
}
如何锁定工作站
使用LockWorkStation函数即可锁定工作站。系统会显示一个锁定对话框,告诉用户此工作站正在使用并且已经被锁定,可以被执行锁定的用户或管理员解锁,解锁的方式是按下CTRL_ALT_DEL并用正确的帐号和密码登陆。

LockWorkStation函数成功调用的条件是:
调用者必须是运行在系统交互桌面上的一般进程。
必须已经有用户登陆到系统
工作站未被锁定。
接受关闭通知
拥有正常窗口和消息队列的程序通过WM_QUERYENDSESSION或WM_ENDSESSION消息获得关闭通知。
控制台则是在其控制流程(Handle Routines)里接受关闭通知。要注册一个控制台控制流程,应该使用SetConsoleCtrlHandler函数
服务程序在其控制流程里接受退出通知。要注册一个服务控制流程,应该使用RegisterServiceCtrlHandlerEx函数。
关闭系统函数列表
函数名                函数功能描述
AbortSystemShutdown          取消由InitSystemShutdown引起的系统关闭操作
ExitWindows              注销当前用户
ExitWindowsEx             注销用户,关闭计算机,关闭计算机并且重启
InitiateSystemShutdown         发起关闭系统操作,可以选择关闭后重启
InitiateSystemShutdownEx        同InitiateSystemShutdown,扩展的功能是可以在系统
                    事件日志(事件号6006)中写入一个用户指定的双字节码
LockWorkStation            锁定工作站

系统关闭消息

WM_ENDSESSION

wParam

表示是否要终止程序。如果是TRUE,指令该程序终止,否则是FALSE

lParam

表示用户注销还是系统被关闭。如果此参数包含ENDSESSION_LOGOFF(lParam在这里是按位取值的)位,则表示是用户注销

Windows 2000 以及后续版本:如果lParam ==0,则表示系统被关闭。

程序收到此消息,如果wParam为TRUE,在完成消息处理后,程序随时都有可能被关闭。所以在此消息的处理过程里,应该尽量完成程序销毁前所需要进行的工作。

WM_QUERYENDSESSION

wParam

保留,未使用

lParam

同WM_ENDSESSION;

求关机代码! - 蓝白E时代 - 阿根廷风暴 - Powered by Discuz! E时代必读书目 - 雅昌茶舍 - 雅昌艺术论坛 - Powered by Discuz! 趣诗集 - 诗风词韵 - 蓝岸社区 - Powered by Discuz! 论坛 - Powered by Discuz! 笑话 - powered by Discuz! 蓝CPU使用率高的原因和解决方法以及案例分析 - powered by Discuz! 小学生反义词 - 『教育成长』 - 安庆E网生活 - Powered by Discuz! 地学论坛 - Powered by Discuz! 深度技术论坛 - Powered by Discuz! - 开心论坛 - Powered by Discuz... 西方民主的搞笑逻辑 - 时代中国 - 环球论坛 - Powered by Discuz! 宋朝历史分析:中古时代中国的顶峰 - 历史茶坊 - 环球论坛 - Powered by Discuz! 央视为何要棒杀张悟本? - 时代中国 - 环球论坛 - Powered by Discuz... “百年不遇”为什么年年遇 - 时代中国 - 环球论坛 - Powered by Discuz! 郭德纲应向妓女道歉 - 时代中国 - 环球论坛 - Powered by Discuz! 【腐败中国】北京美女新三陪!你绝猜不到多恐怖 - 真情蓝剑 - Powered by Discuz!N... 混合式学习的四个层次 - 混合式学习 - 在线教育资讯 e-Learning | 在线教育 | 人才管理 | HRD | - Powered by Discuz! 股票吧论坛 - Powered by Discuz! Board 史上暴强暴笑校园笑话 - powered by Discuz! 新警察(全) - powered by Discuz! DMI - 慧眼看盘2 - Powered by Discuz! 先学后教当堂训练 - Powered by Discuz!NT 看后能笑五分钟的笑话 - powered by Discuz! 人龙道学论坛 - Powered by Discuz!