DOS程序WINDOWS化的完整程序,关机时能正常关闭,不会弹出“windows不能自动关闭“的对话框!!!!

解决方案 »

  1.   

    我的那个程序就是针对“windows 无法自动关闭此程序,建议使用‘退出‘ 命令退出“写的,不知道你是否试验了,你直接关闭dos程序都会出现那个窗口,我的程序你不试验怎么知道无法关闭?我除了关闭command.com,还能关闭tc,和几个dos游戏。强烈建议你试验后再说不行。另外如何得到系统关机信息以及做收尾工作参考这个
      

  2.   

    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