用ExitWindowsEx关闭Windows,有时会关不了!???你能告诉我怎么办?(50分)

  • 主题发起人 主题发起人 HN-Huang
  • 开始时间 开始时间
H

HN-Huang

Unregistered / Unconfirmed
GUEST, unregistred user!
ExitWindowsEx(UINT uFlags,DWORD dwReserved);是实现这一功能的API函数 <br><br>
 
控制WINDOWS的开关:如关闭WINDOWS,重新启动WINDOWS等, ExitWindowsEx(UINT uFlags,DWORD dwReserved);是实现这一功能的API函数<br>首先定义常数<br>const<br>EWX_FORCE=4; //关闭所有程序并以其他用户身份登录<br>EWX_LOGOFF=0; //重新启动计算机并切换到MS-DOS方式<br>EWX_REBOOT=2; //重新启动计算机<br>EWX_SHUTDOWN=1;//关闭计算机<br>运行时给How赋值,让他等于EWX_SHUTDOWN或其他,调用以下语句<br>ExitWindowsEx(How,0);<br><br>
 
你如果是在windowsNT 环境下,<br>此API 无效
 
我的工作环境是Winme。<br>我说的是,有时候可以关闭,有时候不行!<br><br>刚才看了以前的贴子,知道udp之类的控件,可能导致关不了!<br>如果是自己的程序还好办,如果是别人的程序。那我如何知道那一类程序会出现这种情况。<br><br>还有winme是不是没有关闭系统并切换到ms-dos方式,反正我的系统没有!?
 
function My_ExitWindows(M_1Reboot_2Power: integer): Boolean; //重启(M:=1).关机(M:=2)<br>var<br>hToken: THANDLE;<br>hProc: THANDLE;<br>mLUID: TLargeInteger;<br>mPriv, mNewPriv: TOKEN_PRIVILEGES;<br>mBufferLength: DWord;<br>begin<br>Result:=false;<br>if not (M_1Reboot_2Power in [1, 2]) then exit;<br>hProc := GetCurrentProcess();<br>OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken);<br>LookupPrivilegeValue('', 'SeShutdownPrivilege', mLUID);<br>mPriv.PrivilegeCount := 1;<br>mPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;<br>mPriv.Privileges[0].Luid := mLUID;<br>AdjustTokenPrivileges(hToken, False, mPriv, (4 + (12 * mPriv.PrivilegeCount)), mNewPriv, mBufferLength);<br>GetLastError;<br>case M_1Reboot_2Power of<br>1: Result := ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0);<br>2: Result := ExitWindowsEx(EWX_FORCE+EWX_POWEROFF, 0);<br>end;<br>end;<br><br><br>其实简单地用ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0);也可以重启,但有时候在系统还没有关闭时你的程序就已经关闭了所以必需用这个方法。<br>这个方法可以用于WIN9X、WINNT、WIN2000。<br><br><br>
 
to jingtao<br>这一段代码的作用是?能否解释一下:)<br>hProc := GetCurrentProcess();<br>OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken);<br>LookupPrivilegeValue('', 'SeShutdownPrivilege', mLUID);<br>mPriv.PrivilegeCount := 1;<br>mPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;<br>mPriv.Privileges[0].Luid := mLUID;<br>AdjustTokenPrivileges(hToken, False, mPriv, (4 + (12 * mPriv.PrivilegeCount)), mNewPriv, mBufferLength);<br>GetLastError;<br>
 
&nbsp;别说用这个API了,就连用Windows关闭菜单都有时关不了
 
to leebons<br>同意你的说法!<br>jmp ffffff 可以重新启动<br>但有没有象它一样的关机方法呢?
 
to HN-Huang&gt;Nt和2000下关机等要添加相应权限,这段代码就是了。
 
to jingtao <br>&nbsp; &nbsp; 不知道你遇到过这样的情况没
 
多人接受答案了。
 
后退
顶部