如何捕捉系统关机?
想在系统关机前做点东西, 如何才能捕捉关机发生呢?
注意了, 只响应 关机, 不响应 重起, 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




