如何实现定时关机,如晚上10:00关机,以后机器运行到此时就强制关机。并且用户看不到程序的运行,和一个隐藏的进程一样。谢谢

解决方案 »

  1.   

    function ShutDownSystem():BOOL;
    var
      hProcess,hAccessToken:THandle;
      LUID_AND_ATTRIBUTES:TLUIDAndAttributes;
      TOKEN_PRIVILEGES: TTokenPrivileges;
      BufferIsNull:DWORD;
    Const
      SE_SHUTDOWN_NAME='SeShutdownPrivilege';
    begin
      hProcess:=GetCurrentProcess();OpenProcessToken(hprocess,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,hAccessToken);
      LookupPrivilegeValue(Nil,SE_SHUTDOWN_NAME,LUID_AND_ATTRIBUTES.Luid);
      LUID_AND_ATTRIBUTES.Attributes:=SE_PRIVILEGE_ENABLED;
      TOKEN_PRIVILEGES.PrivilegeCount:=1;
      TOKEN_PRIVILEGES.Privileges[0]:=LUID_AND_ATTRIBUTES;
      BufferIsNull:=0;AdjustTokenPrivileges(hAccessToken,False,TOKEN_PRIVILEGES,sizeof(TOKEN_PRIVI
    LEGES),Nil,BufferIsNull);
      ExitWindowsEx(EWX_REBOOT, 0);
    ShutDownSystem:=True;
    end;
    做个程序加到计划任务中,或者在程序中用定时器检测时间,到时执行上面的代码
      

  2.   

    ExitWindowsEx(EWX_REBOOT, 0);
    ExitWindowsEx(EWX_Shutdown, 0);
    ^^^^………………………………
    …………………………
      

  3.   

    用一个TIMER来检测时间
    到时用 ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN,64)可以强制关闭,我在后面那个数字为0是出现了问题,所以用64或其它数字,自己试一下吧.在WIN2000下就参考 :galeboy(狂风) 
    要隐藏程序就不是那么简单,反正你也要让程序自动运行,就放在注册表的RunServices里
      

  4.   

    Showwindow(GetCurrentProcess,SW_HIDE);
      SetPriorityClass(GetCurrentProcess,REALTIME_PRIORITY_CLASS);
      Form1.Visible:=false;
    看不到程序,你把工程文件在保存为什么SYSTEMN这样就更吓唬人了.
      

  5.   

    加个timer控件即可
    ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN,38)
      

  6.   

    要看你的操作系统的.win98/95 用 ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN,38) 就行了.win2000 还不行.具体去搜索一下吧.
      

  7.   

    void __fastcall TForm1::BtnClick(TObject *Sender)//确定按键,先选中你要做的事情 
    {
          DWORD dwVersion = GetVersion();
          if (dwVersion < 0x80000000)                // Windows XP or2000
          {
            HANDLE hProcess,hToken;
            TOKEN_PRIVILEGES Privileges;
            LUID luid;
            hProcess=GetCurrentProcess();
            OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);
            Privileges.PrivilegeCount=1;
            LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
            Privileges.Privileges[0].Luid=luid;
            Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
            AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL);
            //ExitWindowsEx(EWX_POWEROFF, 0);
          }
           if(RadioGroup2->ItemIndex==1)//选注销
               ExitWindowsEx(EWX_LOGOFF,0);
           else if(RadioGroup2->ItemIndex==0)//选关机
               ExitWindowsEx(EWX_SHUTDOWN,0);
           else if(RadioGroup2->ItemIndex==2)//选重起
               ExitWindowsEx(EWX_REBOOT,0);
           else if(RadioGroup2->ItemIndex==3)//启动定时关机.
               Form2->Timer->Enabled=true;
    }
    //---------------------------------------------
    void __fastcall TForm2::Timer1Timer(TObject *Sender)
    {    
         StatusBar->Panels->Items[1]->Text=TimeToStr(Time());
         if(StatusBar->Panels->Items[1]->Text="10:00:00";
         ExitWindowsEx(EWX_SHUTDOWN,0);
    }这是我自己实现过的程序的部分代码,该了一点,如果你要实现定时关机的灵动性的话
    就要将Timer1Timer()重新写过.让时间可以自己输入,我做过,但代码不知道那里去来.
    有问题跟我联系,[email protected]
      

  8.   

    RadioGroup2里面的东西你自己加,
      

  9.   

    我以前用delhpi+98做过这么一个小程序,挺好用
    ExitWindowsEx(EWX_Shutdown, 0);win2000没有试过。