[原创]关于VB关机的一点心得
*/ --------------------------------------------------------------------------------------<BR>*/ 出自: 编程中国 http://www.bc-cn.net<BR>*/ 作者: china25qd QQ:541890537<BR>*/ 时间: 2007-10-3 编程论坛首发<BR>*/ 声明: 尊重作者劳动,转载请保留本段文字<BR>*/ --------------------------------------------------------------------------------------<BR><BR><BR>先说一下要调用的API:<BR>'目的:退出系统,所有句柄以Or连接<BR>'输入:uFlags:EWX_FORCE:可以强迫终止没有响应的进程<BR>' EWX_LOGOFF:可以终止进程,然后注销<BR>' EWX_SHUTDOWN:关掉系统电源<BR>' EWX_REBOOT:重新引导系统<BR>' dwReserved:保留,设置为0<BR>'返回:非0即成功,0为失败!<BR>Public Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long<BR>'--------------------<BR>'以下属性皆As Long<BR>Public Const EWX_FORCE = 4<BR>Public Const EWX_LOGOFF = 0<BR>Public Const EWX_REBOOT = 2<BR>Public Const EWX_SHUTDOWN = 1<BR>Public Const EWX_POWEROFF = 8<BR><BR>好,我们再来看系统:<BR>2000以下的版本直接调用一个底层API:ExitWindowsEx()<BR>2000以上的,由于内核变成WinTN的了,你还要给程序一个权限才行.<BR>那么我怎样赋予程序权限呢?<BR>Public Sub AdjustToken()<BR>Const TOKEN_ADJUST_PRIVILEGES = &H20<BR>Const TOKEN_QUERY = &H8<BR>Const SE_PRIVILEGE_ENABLED = &H2<BR>'----------------<BR>Dim hdlProcessHandle As Long<BR>Dim hdlTokenHandle As Long<BR>Dim tmpLuid As LUID<BR>Dim tkp As TOKEN_PRIVILEGES<BR>Dim tkpNewButIgnored As TOKEN_PRIVILEGES<BR>Dim lBufferNeeded As Long<BR>'----------------<BR>'调用API函数 GetCurrentProcess 获取当前进程的句柄<BR>hdlTokenHandle = GetCurrentProcess()<BR>'----------------<BR>'调用函数 OpenProcessToken 打开当前进程的访问代号,并存储在 hdlTokenHandle 中<BR>OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle<BR>'----------------<BR>'获取底层权限:<BR>LoopupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid<BR>tkp.PrivilegeCount = 1<BR>tkp.TheLuid = tmpLuid<BR>tkp.Attributes = SE_PRIVILEGE_ENABLED<BR>'----------------<BR>'为程序获取关机权限<BR>AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded<BR>End Sub<BR>哈哈![em01]这样,我们的程序就能在2000以上的环境中调用底层权限了!<BR><BR>为了程序更好用,我们可以这么写:<BR>'如果操作系统不是Win 9X系列<BR>If glngWhichWindows32 = mlngWindowsNT Then<BR>'调用上面自定义过的函数AdjustToken<BR> AdjustToken<BR>End If<BR>'调用API函数ExitWindowsEx关闭机子<BR>Call ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_POWEROFF), 0)<BR><BR>这样子就能关机了.<BR>嘿嘿,相信很多高手看了都会说<BR><DIV class=quote><B>以下是引用<U>leiyuzi</U>在2007-9-23 15:30:00的发言:</B><BR>和没有说一样</DIV>不过我这是写给不懂的人看的[em02] 嗯 不错的文章 进行一些理论探讨是很值得提倡的。 <P>好的.</P> 晕,看不懂.<BR>问一个简单的问题:<BR>我的一个打印程序,用户可能会单击右上角的关闭按钮或左上角的控制菜单框的关闭(即Alt+F4)来关闭程序,<BR>可问题是该程序仍然在内存运行中,非得通过"退出"按钮"的<BR>Unload form<BR>命令才能完全退出.<BR>该如何解决. 哎,学习VB得从娃娃抓起.... EWX_FORCE:可以强迫终止没有响应的进程<BR>其实所有的进程都是的 谢谢LZ<BR> 不错 shell "shutdonw -s -t 0" <P>不错,顶一个~~</P> Dim tmpLuid As LUID<BR>Dim tkp As TOKEN_PRIVILEGES<BR>Dim tkpNewButIgnored As TOKEN_PRIVILEGES<BR>请问,这几句自定义数据类型是怎么定义的?<BR>作用又是? <DIV class=quote><B>以下是引用<U>XMeLoDy</U>在2007-10-27 21:28:55的发言:</B><BR>Dim tmpLuid As LUID<BR>Dim tkp As TOKEN_PRIVILEGES<BR>Dim tkpNewButIgnored As TOKEN_PRIVILEGES<BR>请问,这几句自定义数据类型是怎么定义的?<BR>作用又是?</DIV>
<P>declarations : see api text viewer.</P> TKS,OK![em17] lz好强<BR> <DIV class=quote><B>以下是引用<U>三断笛</U>在2007-10-20 14:40:17的发言:</B><BR>shell "shutdonw -s -t 0"</DIV>
<P>看来L上的哥们的确,大概真的很激动![em02]<BR></P> 互相學習,其實我自己也做了一個只是多加了一個定時
页:
[1]
