一个Bitbtn、一个edit、一个Timer用来完成关机,把桌面清除完毕,留下张光秃秃的桌面就不动了,鼠标还能动,怎么回事?  程序如下:procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    begin
    if strtodatetime(Edit1.Text)<=now then
    begin
    MessageBox(handle,'设置有误,请重来!','错误!',mb_ok or MB_ICONERROR);
    exit;
    end
    else
    if timer1.Enabled =false then
    timer1.Enabled :=true;
    end;
    //隐藏主窗体form1
    ShowWindow(form1.Handle,sw_hide);
end;    //Timer,实现关机
procedure TForm1.Timer1Timer(Sender: TObject);
var
    htoken:thandle;
    tkp:token_privileges;
    rr:dword;
    t:tdatetime;
begin
    t:=strtodatetime(Edit1.text);
    if now>=t then
    begin
    openprocesstoken(getcurrentprocess(),token_adjust_privileges or token_query,htoken);
    lookupprivilegevalue(nil,'seshutdownprivilege',tkp.privileges[0].luid);
    //设定权限为1
    tkp.PrivilegeCount:=1;
    tkp.privileges[0].Attributes:=se_privilege_enabled;
    //得到关机权限
    adjusttokenprivileges(htoken,false,tkp,0,nil,rr);
    //关闭计算机
    exitwindowsex(ewx_force or ewx_shutdown or ewx_poweroff,0);
    PostMessage(handle,wm_Destroy,0,0);
    end;end;

解决方案 »

  1.   

    把关机代码直接放到Bitbtn上是可以关掉机器的!
      

  2.   

    PostMessage(handle,wm_Destroy,0,0);
    改为:
    Timer1.Enabled:=false;
    PostMessage(handle,wm_Destroy,0,0);
      

  3.   

    多谢Eastunfail(恶鱼杀手),成功了!
    但是我不明白,直接设置Timer属性为false再在bitbtn上改为true为何不行??
    再就是,这个关机程序适合Win98、95么?
    再次谢谢!  晚上给你结帐!
      

  4.   

    呵呵~你把代码放到 Timer中,不把属性Enabled设为false的话,那个关机操作就会执行多遍阿~~但是如果你放在BitBtn里,一般只执行一遍。调整权限的API在9x中存在的。你就当他是个摆设。执不执行无所谓。而在nt内核的操作系统中,是必须要修改权限的。