前些时间,在网上看到了一些自动关机的程序,觉得挺有意思的,于是自己动手尝试了一下,其中遇到了很多问题,也总结出一些经验,在这里想和大家分享一下。(另:我也是初学SDK,其中有什么不对的地方请大家及时指正。)   首先,自动关机是个很小的程序,所以界面只需要一个Dialog就可以了。我用的是CreateDialog()函数,但一切框架搭好之后发现根本没有进入消息循环。之后通过比较一些文件(我自己写的文件和一些例子程序)发现rc文件中应该加入"AutoShutDown",其中"AutoShutDown"应该换成你所创建的Windows类的类名。他的作用就是使你创建的对话框和你的主窗口类建立联系。
   
   我遇到的第二个问题花去了我很长的时间。就是程序的核心函数ExitWindowsEX,
这个函数可以通过一些参数来设定关机的方式----关机、重新启动等。但经过试验发现它在WindowsNT和WindowsXP下面并不好用。通过阅读MSDN,才知道在NT内核的操作系统上,关机的权限已经不能获得了(但是可以注销)。MSDN上的原文是这样的:
Windows NT/2000: To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, see Privileges. 
就是说如果你想使用ExitWindowsEX()进行关机操作的话,就应该调用AdjustTokenPrivileges()函数给你当前的程序设置可以关机的权限。这个函数的作用是重新设置你所能拥有的对Windows的控制权限。但使用这个函数之前还应该使你有重新设置“对Windows的控制权限”的权限(好烦阿),也就是正确调用AdjustTokenPrivileges()的权限。这就用到了OpenProcessToken函数。函数原型为:BOOL OpenProcessToken(
            HANDLE ProcessHandle, // handle to process
            DWORD DesiredAccess,  // desired access to process
            PHANDLE TokenHandle   // handle to open access token
          );
其中第二个参数就是设置一些Windows所要给你的权限,我的程序里设置的是TOKEN_ADJUST_PRIVILEGES,其他的用法请参考MSDN。第三个返回参数就是AdjustTokenPrivileges()所需要的Token句柄。另外,VC中对于一些权限参数的宏是字符串变量,所以还要用LookupPrivilegeValue()转换成权限的ID。我想说的就是这么多了,我想我自己说的不是很明白(汗.....),所以附上关键代码,希望能给我所说的一些补充。TOKEN_PRIVILEGES Privileges;
HANDLE hToken;
//取得关机权限的ID
LUID luid;
LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid );

//填充关机权限结构体
Privileges.PrivilegeCount = 1;
Privileges.Privileges[ 0 ].Luid = luid;
Privileges.Privileges[ 0 ].Attributes = SE_PRIVILEGE_ENABLED;
//使当前程序获得能改变权限的权限
OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken );//设置此程序据有关机权限
AdjustTokenPrivileges ( hToken, 
                        FALSE, 
                        &Privileges, 
                        sizeof( TOKEN_PRIVILEGES ),
                        (PTOKEN_PRIVILEGES) NULL, 
                        (PDWORD)NULL );
//判断是否设置成功
if (GetLastError() != ERROR_SUCCESS) 

  bSure = false;
  MessageBox( NULL, TEXT("关机权限设置失败!"), TEXT( "ERROR" ),     MB_ICONERROR );
return 0; 
}  ExitWindowsEx( EWX_POWEROFF, 0 );
PostQuitMessage ( 0 );以上的代码段是加在WM_Timer消息相应中的。第一次写文章,写得乱七八糟,谢望大家能够原谅。

解决方案 »

  1.   

    我就刚好写了一个自动关机的程序,结合其他的,可以当作病毒使用(当然我不会这么干的)下面谈谈结合的方法:
    1) 程序一运行就hide,并复制到系统目录,修改注册表,让它每次重启后,运行系统目录下的那个程序.2) 定时.3) 关机..是不是病毒? 嘿嘿...当然你可以做的更狠点的,建议只供学习,我痛恨病毒的.
      

  2.   

    关机的code很多,你自己找找吧
      

  3.   

    高手,难怪我做的关机程序只在windows 98下有效
      

  4.   

    试验了一下,在WIN2K下没有问题,在98下,需要使用EWX_SHUTDOWN才能关机
      

  5.   

    这样也很简单的实现了重启:
    void main()
    {
        printf("\t\b\b");
    }编译执行后就回重启计算机。不信你试试。
      

  6.   

    RE:   unrise(小超) 
     病毒有这么简单?
     你想王江民吐血而死,也不用这么搞他吧!