CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  API

如何捕捉系统关机?

楼主alex_fan(alex.fan)2004-09-03 16:44:58 在 VB / API 提问

想在系统关机前做点东西,   如何才能捕捉关机发生呢?  
   
  注意了,   只响应   关机,   不响应   重起,   LOGOFF 问题点数:0、回复次数:16Top

1 楼tztz520(午夜逛街)回复于 2004-09-03 16:48:02 得分 0

'以下在Form    
  Private   Sub   Form_Load()  
      Dim   ret   As   Long  
      '记录原本的Window   Procedure的位址  
      preWinProc   =   GetWindowLong(Me.hwnd,   GWL_WNDPROC)  
      '设定form的window   Procedure到wndproc  
      ret   =   SetWindowLong(Me.hwnd,   GWL_WNDPROC,   AddressOf   wndproc)  
  End   Sub  
   
  Private   Sub   Form_Unload(Cancel   As   Integer)  
      Dim   ret   As   Long  
      '取消Message的截取,而使之又只送往原来的Window   Procedure  
      ret   =   SetWindowLong(Me.hwnd,   GWL_WNDPROC,   preWinProc)  
      '这里只是要看看用关机的方式结束程式时,会不会执行到这里  
      Dim   fno   As   Long  
      fno   =   FreeFile  
      Open   "c:\tt2"   For   Append   As   fno  
      Print   #fno,   "ccc"   +   vbCrLf  
      Close   #fno  
  End   Sub  
   
     
  '以下在.Bas   Option   Explicit  
   
    Declare   Function   SetWindowLong   Lib   "user32"   Alias   "SetWindowLongA"   _  
        (ByVal   hwnd   As   Long,   ByVal   nIndex   As   Long,   ByVal   dwNewLong   As   Long)   As   Long  
    Declare   Function   GetWindowLong   Lib   "user32"   Alias   "GetWindowLongA"   _  
        (ByVal   hwnd   As   Long,   ByVal   nIndex   As   Long)   As   Long  
    Declare   Function   CallWindowProc   Lib   "user32"   Alias   "CallWindowProcA"   _  
        (ByVal   lpPrevWndFunc   As   Long,   ByVal   hwnd   As   Long,   ByVal   Msg   As   Long,   _  
          ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long  
   
      Public   Const   GWL_WNDPROC   =   (-4)  
      Public   Const   WM_ENDSESSION   =   &H16  
      Public   Const   WM_QUERYENDSESSION   =   &H11  
   
      Public   preWinProc   As   Long  
   
      Public   Function   wndproc(ByVal   hwnd   As   Long,   ByVal   Msg   As   Long,   _  
                                                      ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long  
      If   Msg   =   WM_QUERYENDSESSION   Then  
            Debug.Print   "QryEnd",   wParam,   lParam  
      Else  
              If   Msg   =   WM_ENDSESSION   Then  
                    If   wParam   <>   0   Then   '代表将顺利关机或LogOff,这时便得做正常结束程式的动作  
                          Dim   fno   As   Long  
                          Open   "c:\ttt"   For   Output   As   #1  
                          Print   #1,   "hahcccc5"  
                          Close   #1  
                    End   If  
              End   If  
      End   If  
      '将之送往原来的Window   Procedure  
      wndproc   =   CallWindowProc(preWinProc,   hwnd,   Msg,   wParam,   lParam)  
      End   Function  
     
  Top

2 楼renjunjun(飞黄)回复于 2004-09-03 16:55:47 得分 0

楼上的兄台速度太快了吧?Top

3 楼xanger(do while MYM<400000)回复于 2004-09-03 17:56:29 得分 0

:(  
  看来以后得再长只手了:0Top

4 楼xanger(do while MYM<400000)回复于 2004-09-03 18:12:03 得分 0

怎么越看越不明白了???Top

5 楼alex_fan(alex.fan)回复于 2004-09-06 08:51:32 得分 0

飞速兄台的代码,   偶已经在用了,   但是偶要找的是,   能把关机,   重起,   LOGOFF操作分开的方法.  
   
  偶只想在关机响应,   其他的不要.Top

6 楼DemonLoveLizzy(^_^)!!! 用户中文昵称 ? 是什么东东 ? :)回复于 2004-09-06 09:35:11 得分 0

关机的wParam应该是1吧。我也几不住。不是1就是2。你把上面的   IF   wParam<>0改成wParam=1就可以了。Top

7 楼alex_fan(alex.fan)回复于 2004-09-06 12:20:43 得分 0

恩,是一种办法,   但是只能对应飞快的操作,  
  对于稍微费时的操作就不行了,  
   
  如果在WM_QUERYENDSESSION   里面能捉到,   就可以阻塞关机,   然后做操作,   完成后自己关.  
  但是在WM_ENDSESSION不能阻塞.    
  Top

8 楼haiz_2001(海啸)回复于 2004-09-06 12:48:01 得分 0

学习!Top

9 楼rainstormmaster(暴风雨 v2.0)回复于 2004-09-06 12:58:22 得分 0

//关机的wParam应该是1吧。我也几不住。不是1就是2。你把上面的   IF   wParam<>0改成wParam=1就可以了。  
   
  这个要看是怎么样发出关机命令,也可能是0Top

10 楼degeshi(大笨象)回复于 2004-09-06 19:15:51 得分 0

我也有这种想法,今天终于知到怎么做了,  
  要学习呀,!1  
  谢放Top

11 楼starsoulxp(星魂)回复于 2004-09-06 19:23:46 得分 0

学习Top

12 楼alex_fan(alex.fan)回复于 2004-11-04 17:27:17 得分 0

还没有解决,   不行就散了算了.Top

13 楼baoaya(点头)(大风起兮云飞扬)回复于 2004-11-04 18:23:24 得分 0

Private   Sub   Form_QueryUnload(Cancel   As   Integer,   UnloadMode   As   Integer)  
  Dim   strMessage   As   String  
  Select   Case   UnloadMode  
          Case   vbFormControlMenu  
                  strMessage   =   "用户手动关闭"  
          Case   vbFormCode  
                  strMessage   =   "Unload   语句被代码调用"  
                   
          '这个是你想要的关机事件  
          Case   vbAppWindows  
                  strMessage   =   "当前   Microsoft   Windows   操作环境会话结束"  
          Case   vbAppTaskManager  
                  strMessage   =   "Microsoft   Windows   任务管理器正在关闭应用程序"  
          Case   vbFormMDIForm  
                  strMessage   =   "MDI   子窗体正在关闭,因为   MDI   窗体正在关闭"  
          Case   vbFormOwner  
                  strMessage   =   "因为窗体的所有者正在关闭,所以窗体也在关闭"  
  End   Select  
   
  Cancel   =   MsgBox("程序关闭原因:"   &   strMessage   &   vbCrLf   &   "您要关闭吗?",   vbOKCancel)   -   1  
  End   SubTop

14 楼baoaya(点头)(大风起兮云飞扬)回复于 2004-11-04 18:24:28 得分 0

注:在Form_QueryUnload事件里写上   上面的代码Top

15 楼51365133(渊海)回复于 2004-11-04 18:42:46 得分 0

VOID   WINAPI   WlxLogoff   (PVOID   pWlxContext)  
  {  
      PGINA_CONTEXT   pgContext   =   (PGINA_CONTEXT)   pWlxContext;  
   
      //   Clear   out   any   user   specific   information   in   the   context.  
      pgContext->UserToken   =   NULL;  
       
  }  
  不知道vb可以不可以捕捉到这个函数,它是GINA里的关机函数,如果可以的话  
   
  在里边返回  
   
  return   WLX_SAS_ACTION_NONE;  
   
  就可以了  
   
  还有就是这个函数!!  
   
  VOID   WINAPI   WlxShutdown(  
      PVOID   pWlxContext,  
      DWORD   ShutdownType)  
  {  
      if   (pWlxContext)  
      {  
          PGINA_CONTEXT   pgContext   =   (PGINA_CONTEXT)   pWlxContext;  
          pgContext->pWlxFuncs->WlxMessageBox(pgContext->hWlx,  
                                                                                  NULL,  
                                                                                  L"Shutdown   In   Progress",  
                                                                                  L"Gina   WlxShutdown",  
                                                                                  MB_OK);  
      }  
  }  
   
   
  关注VB控制这两个函数的方法!!  
  Top

16 楼newwish2(侯)回复于 2004-11-21 12:16:14 得分 0

我很想知道!怎样远程控制关机Top

相关问题

  • 如何截取系统关机信息并阻止关机?
  • 如何配置solaris8,使系统不再自动关机?
  • sco unix系统,如何判断是否为非正常关机
  • 如何检测出操作系统关机或重启操作?
  • 请问如何让系统关机或者重启?
  • Windows2000如何查看系统关机调用的API
  • 急!急!如何得知系统正在关机?
  • C#,如何接收系统关机消息?
  • 请教用C#如何来控制系统关机
  • 如何截获系统关机、重启、注销的事件?

关键词

  • 函数
  • 代码
  • 关机
  • pgcontext
  • pwlxcontext
  • strmessage
  • pgina
  • 窗体
  • prewinproc
  • 捕捉

得分解答快速导航

  • 帖主:alex_fan

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo