form codeOption Explicit Private Sub Form_Load() oldwinproc = GetWindowLong(Me.hWnd, GWL_WNDPROC) SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf OnMenu End Sub Private Sub Form_Unload(Cancel As Integer) SetWindowLong Me.hWnd, GWL_WNDPROC, oldwinproc End Submodule code Option ExplicitPublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public 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 Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Public Const GWL_WNDPROC = (-4) Public oldwinproc As Long Public Const WM_QUERYENDSESSION = &H11Public Function OnMenu(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Select Case wMsg Case WM_QUERYENDSESSION MsgBox "系统要关机了" End Select OnMenu = CallWindowProc(oldwinproc, hWnd, wMsg, wParam, lParam) End Function'以上程序可以获得windows将要关机的信息,在下面使用我第一次贴上去的代码来结束dos窗口,你要知道WM_CLOSE是正规的结束应用程序的方法,但是不能结束非WINDOWS程序,而绝对的结束任何应用程序的方法就是terminateprocess,再次建议你尝试一下,我试验通过的程序共6个,command.com, tc.exe, sg.exe(三国),debug.com, edit.exe, 以及计算器,再贴一次,只要你知道那个窗口的句柄,保证没问题Option Explicit Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Const PROCESS_TERMINATE = &H1''用于结束外部进程,hCloseWnd 是要结束的程序的主窗口的 HWND Public Function TerminateProcessByHWND(ByVal hCloseWnd As Long) As Boolean Dim hProcessID As Long Dim hProcess As Long On Error GoTo PROC_EXIT If hCloseWnd = 0 Then GoTo PROC_EXIT If GetWindowThreadProcessId(hCloseWnd, hProcessID) = 0 Then GoTo PROC_EXIT hProcess = OpenProcess(PROCESS_TERMINATE, False, hProcessID) If hProcess = 0 Then GoTo PROC_EXIT If TerminateProcess(hProcess, 0&) = 0 Then GoTo PROC_EXIT TerminateProcessByHWND = True PROC_EXIT: If Err.Number <> 0 Then Debug.Print Err.Description Err.Clear End If End FunctionPrivate Sub Command1_Click() Shell "command.com", vbNormalFocus Command1.Enabled = False Dim s As Double s = Timer Do DoEvents Loop While Timer - s < 5 Dim l As Long l = FindWindow("ConsoleWindowClass", vbNullString) TerminateProcessByHWND l Command1.Enabled = True End Sub
Private Sub Form_Load()
oldwinproc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf OnMenu
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hWnd, GWL_WNDPROC, oldwinproc
End Submodule code
Option ExplicitPublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public 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 Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public oldwinproc As Long
Public Const WM_QUERYENDSESSION = &H11Public Function OnMenu(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case wMsg
Case WM_QUERYENDSESSION
MsgBox "系统要关机了"
End Select
OnMenu = CallWindowProc(oldwinproc, hWnd, wMsg, wParam, lParam)
End Function'以上程序可以获得windows将要关机的信息,在下面使用我第一次贴上去的代码来结束dos窗口,你要知道WM_CLOSE是正规的结束应用程序的方法,但是不能结束非WINDOWS程序,而绝对的结束任何应用程序的方法就是terminateprocess,再次建议你尝试一下,我试验通过的程序共6个,command.com, tc.exe, sg.exe(三国),debug.com, edit.exe, 以及计算器,再贴一次,只要你知道那个窗口的句柄,保证没问题Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Const PROCESS_TERMINATE = &H1''用于结束外部进程,hCloseWnd 是要结束的程序的主窗口的 HWND
Public Function TerminateProcessByHWND(ByVal hCloseWnd As Long) As Boolean
Dim hProcessID As Long
Dim hProcess As Long
On Error GoTo PROC_EXIT
If hCloseWnd = 0 Then GoTo PROC_EXIT
If GetWindowThreadProcessId(hCloseWnd, hProcessID) = 0 Then GoTo PROC_EXIT
hProcess = OpenProcess(PROCESS_TERMINATE, False, hProcessID)
If hProcess = 0 Then GoTo PROC_EXIT
If TerminateProcess(hProcess, 0&) = 0 Then GoTo PROC_EXIT
TerminateProcessByHWND = True
PROC_EXIT:
If Err.Number <> 0 Then
Debug.Print Err.Description
Err.Clear
End If
End FunctionPrivate Sub Command1_Click()
Shell "command.com", vbNormalFocus
Command1.Enabled = False
Dim s As Double
s = Timer
Do
DoEvents
Loop While Timer - s < 5
Dim l As Long
l = FindWindow("ConsoleWindowClass", vbNullString)
TerminateProcessByHWND l
Command1.Enabled = True
End Sub