开机时运行可以用代码改注册表,关机时运行在2000/XP等中可以通过控制面板中的某个管理工具来手动实现,怎么能用代码实现呢?
解决方案 »
- VB远程操作 My Sql数据库问题
- 小问题:取得文本文件最后一行数据
- 如何同时打开两个Excel应用程序,用他们同时打开不同表格文件?
- 我想获取一张存在硬盘内的png格式的图片象素点
- 一个关于Printer的非常奇怪的问题
- 怎样创建一个可以在别处直接调用的dll?
- 如何释放WebBrowser控件占用的内存?(请教高手)
- 求VS.net的下载地址!(要求不限制速度)
- 大家能不能讨论一下VB环境下的三层结构应用程序的开发,有说的好的,我给100分!我以前给很多分没人回答,分都废了,这回先给1分,有说的
- 小第以前用VB都是作数据库的,不知道用VB开发防火墙这样的软件难不难,我应该从那里下手呢?
- 如何打开文件夹??
- 程序升级ActiveX DLL问题,求教。
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 '
'正在关机.
'在这里执行
End If
End If
End If
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
'窗体代码.
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 SubPrivate Sub Form_Unload(Cancel As Integer)
Dim ret As Long
'取消Message的截取,而使之又只送往原来的Window Procedure
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
End Sub
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 SubPrivate 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’以下在.BasOption ExplicitDeclare 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 LongPublic Const GWL_WNDPROC = (-4)
Public Const WM_ENDSESSION = &H16
Public Const WM_QUERYENDSESSION = &H11Public preWinProc As LongPublic 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
顶下,期待高手。
------------
/这个应该比运行个程序还占系统吧?全局钩子又不是VB这一种语言可以写的。
消耗资源时肯定的,除非不监视系统,把关机函数改了,用apihook,晕了
但不能开机执行,因为若是由于系统非法退出或断电,这些信息还是用的着的。
======================
按楼主的要求,我想在开机时运行或许也可以的,关键是如何判断电脑是正常退出还是“非法退出或断电”,由于不清楚楼主的实际情况,所以也不好说