如题,比如说我用vb启动写字板,当该写字板进程被关闭前,vb会提示是否关闭写字板,再决定是否关闭写字板进程。

解决方案 »

  1.   

    1、作用在消息框中显示信息,并等待用户单击按钮,可返回单击的按钮值(比如“确定”或者“取消”)。通常用作显示变量值的一种方式。2、语法MsgBox(Prompt[,Buttons][,Title][,Helpfile,Context])参数说明:(1)Prompt,必需的参数,为字符串,作为显示在消息框中的消息文本。其最大长度约为1024个字符,由所用字符的宽度决定。如果prompt的内容超过一行,则可以在每一行之间用回车符(Chr(13))、换行符(Chr(10))或是回车与换行符的组合(Chr(13)&Chr(10))将各行分隔开来。(2)Buttons,可选的参数,为数值表达式的值之和,指定显示的按钮的数目及形式、使用的图标样式、缺省按钮及消息框的强制回应等,可以此定制消息框。若省略该参数,则其缺省值为0。设置值见下表。(3)Title,可选的参数,表示在消息框的标题栏中所显示的文本。若省略该参数,则将应用程序名放在标题栏中。(4)Helpfile,可选的参数,为字符串表达式,提供帮助文件。若有Helpfile,则必须有Context。(5)Context,可选的参数,为数值表达式,提供帮助主题。若有Context,则必须有Helpfile。3、Button参数用于MsgBox函数中Button参数的常量常量                  值                 说明vbOKOnly                0     只显示“确定”按钮VbOKCancel              1     显示“确定”和“取消”按钮VbAbortRetryIgnore      2     显示“终止”、“重试”和“忽略” 按钮VbYesNoCancel           3     显示“是”、“否”和“取消”按钮VbYesNo                 4     显示“是”和“否”按钮VbRetryCancel           5     显示“重试”和“取消”按钮VbCritical              16    显示“关键信息”图标VbQuestion              32    显示“警告询问”图标VbExclamation           48    显示“警告消息”图标VbInformation           64    显示“通知消息”图标vbDefaultButton1         0    第一个按钮是缺省值(缺省设置)vbDefaultButton2        256第二个按钮是缺省值vbDefaultButton3        512第三个按钮是缺省值vbDefaultButton4        768第四个按钮是缺省值vbApplicationModal        0应用程序强制返回;应用程序一直被挂起,直到用户对消息框作出响应才继续工作vbSystemModal           4096系统强制返回;全部应用程序都被挂起,直到用户对消息框作出响应才继续工作vbMsgBoxHelpButton       16384将Help按钮添加到消息框VbMsgBoxSetForeground 65536指定消息框窗口作为前景窗口vbMsgBoxRight            524288文本为右对齐vbMsgBoxRtlReading      1048576指定文本应为在希伯来和阿拉伯语系统中的从右到左显示说明:(1)第一组值(0–5)描述了消息框中显示的按钮的类型与数目;第二组值(16,32,48,64)描述了图标的样式;第三组值(0,256,512,768)说明哪一个按钮是缺省值;而第四组值(0,4096)则决定消息框的强制返回性。将这些数字相加以生成Buttons参数值的时候,只能由每组值取用一个数字。(2)这些常数都是VBA指定的,可以在程序代码中使用这些常数名称代替实际数值。4、返回值用于MsgBox函数返回值的常量常数            值         说明vbOK             1          确定vbCancel         2          取消vbAbort          3          终止vbRetry          4          重试vbIgnore         5          忽略vbYes            6          是vbNo             7          否5、相关说明(1) 如果同时提供了Helpfile与Context参数,可以按F1键来查看与Context相应的帮助主题,Excel通常会在输入框中自动添加一个帮助(Help)按钮。(2)若在消息框中显示“取消”按钮,则按下ESC键与单击“取消”按钮效果相同。若消息框中有“帮助”按钮,则提供相关的帮助信息。(3)如果要输入多个参数并省略中间的某些参数,则必须在相应位置加入逗号分界符。6、示例(1)使用 MsgBox 函数,在具有“是”及“否”按钮的对话框中显示一条严重错误信息。示例中的缺省按钮为“否”,MsgBox函数的返回值视用户按哪一个钮而定。并假设DEMO.HLP为一帮助文件,其中有一个帮助主题代码为1000。Dim Msg,Style,Title,Help,Ctxt,Response,MyStringMsg="Do you want to continue ?"       ’定义消息文本Style = vbYesNo + vbCritical + vbDefaultButton2       ' 定义按钮Title = "MsgBox Demonstration"       ' 定义标题文本Help = "DEMO.HLP"       ' 定义帮助文件Ctxt = 1000       ' 定义帮助主题Response = MsgBox(Msg, Style, Title, Help, Ctxt)If Response = vbYes Then       ' 用户按下“是”       MyString = "Yes"       ' 完成某操作  在这里可以写你的操作...Else       ' 用户按下“否”       MyString = "No"       ' 完成某操作End If
      

  2.   

    如果你是想过滤消息,就需要HOOK WM_CLOSE  TERMINATEPROCESS API... 等等等等才能完全控制程序的关闭控制权
      

  3.   

    Option ExplicitPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function SetParent Lib "user32.dll" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
    Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Const WS_EX_MDICHILD As Long = &H40&
    Private Const GWL_STYLE = (-16)
    Private Const GWL_EXSTYLE As Long = (-20)
    Private Const WS_CHILD = &H40000000
    Private Const WS_CHILDWINDOW = (WS_CHILD)
    Private Const WM_CLOSE As Long = &H10Dim MDIwordpad As Long'写字板窗口句柄 Private Sub Form_Load()
            
            Dim lngStyle As Long
            Dim lngExStyle As Long
            Shell "C:\Program Files\Windows NT\Accessories\wordpad.exe", vbNormalFocus
            MDIwordpad = FindWindow(vbNullString, "文档 - 写字板")
            If MDIwordpad > 0 Then
                SetParent MDIwordpad, Me.hwnd
                SetWindowLong MDIwordpad, GWL_EXSTYLE, WS_EX_MDICHILD
            End If
    End Sub'关闭VB窗体时关闭写字板窗口
    Private Sub Form_Unload(Cancel As Integer)
            Call SendMessage(MDIwordpad, WM_CLOSE, 0, 0)
    End Sub
      

  4.   

    Attribute VB_Name = "Module1"
    Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    '//结束钩子
    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    '//下一个钩子
    Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Long) As Long
    '//发送消息
    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As LongPrivate Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
    Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long
    Declare Function PostThreadMessage Lib "user32" Alias "PostThreadMessageA" (ByVal idThread As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
    Declare Function GetLastError Lib "kernel32" () As LongConst INFINITE = &HFFFF
    Const STARTF_USESHOWWINDOW = &H1
    Private Enum enSW
            SW_HIDE = 0
            SW_NORMAL = 1
            SW_MAXIMIZE = 3
            SW_MINIMIZE = 6
    End Enum
    Private Enum enPriority_Class
            NORMAL_PRIORITY_CLASS = &H20
            IDLE_PRIORITY_CLASS = &H40
            HIGH_PRIORITY_CLASS = &H80
    End EnumPrivate Type PROCESS_INFORMATION
            hProcess   As Long
            hThread   As Long
            dwProcessId   As Long
            dwThreadId   As Long
    End Type
    Private Type STARTUPINFO
            cb   As Long
            lpReserved   As String
            lpDesktop   As String
            lpTitle   As String
            dwX   As Long
            dwY   As Long
            dwXSize   As Long
            dwYSize   As Long
            dwXCountChars   As Long
            dwYCountChars   As Long
            dwFillAttribute   As Long
            dwFlags   As Long
            wShowWindow   As Integer
            cbReserved2   As Integer
            lpReserved2   As Byte
            hStdInput   As Long
            hStdOutput   As Long
            hStdError   As Long
    End Type
    Private Type SECURITY_ATTRIBUTES
            nLength   As Long
            lpSecurityDescriptor   As Long
            bInheritHandle   As Long
    End Type
    Public Const SW_SHOWNORMAL = 1Public Const WM_CLOSE = &H10
    Public Const HCBT_ACTIVATE = 5
    Public Const HCBT_DESTROYWND = 4
    Public Const WH_CBT = 5Public IHwnd As Long
    Public IHook As Long
    Public IThreadId As Long
    Public WindowText As String
    Public IText As String
    '---回调---
    Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If nCode < 0 Then
            HookProc = CallNextHookEx(IHook, nCode, wParam, lParam)
            Exit Function
        End If
        
        If nCode = HCBT_DESTROYWND Then
            If GetCurrentThreadId = IThreadId Then
                If MsgBox("是否关闭当前程序,请确认(Y/N)?", vbYesNo + vbQuestion, "关闭") = vbNo Then
                    nCode = 0
                Else
                End If
            End If
        End If
        HookProc = CallNextHookEx(IHook, nCode, wParam, lParam)
    End Function
    '********************************************************************************************
    '********************************************************************************************
    '-------设置钩子-----------
    Sub EnableHook()
        If IHook = 0 Then
            IHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, App.hInstance, IThreadId)
        End If
    End Sub
    '-------取消钩子-----------
    Sub FreeHook()
        If IHook <> 0 Then
            Call UnhookWindowsHookEx(IHook)
            IHook = 0
        End If
    End Sub
    Public Function Super_Shell(ByVal sFileName As String) As Long
        Dim strResult       As String * 260
        Dim lResult         As Long
        Dim start           As STARTUPINFO
        Dim proc            As PROCESS_INFORMATION
        Dim rc              As Long
        Dim sec1 As SECURITY_ATTRIBUTES
        Dim sec2 As SECURITY_ATTRIBUTES
        Dim strCommandLine  As String
        On Error GoTo ErrProc
        '通过FindExecutable找到的关联文件字符串strResult在返回时,后面会有很多null(asc=0)
        '不把这些null去掉就无法打开指定的文件,只会打开一个空的文件
        '返回值lResult 大于32表示成功;31表示不存在文件类型的关联;0表示系统内存或资源不足;
        'ERROR_FILE_NOT_FOUND表示指定的文件不存在;ERROR_PATH_NOT_FOUND表示指定的路径不存在;ERROR_BAD_FORMAT表示执行格式无效
        lResult = FindExecutable(sFileName, "", strResult)
        If lResult < 32 Then
            MsgBox "没有可以打开" & sFileName & "文件的可执行程序!", vbCritical + vbOKOnly, "提示"
            Exit Function
        Else
                'Set the structure size
            sec1.nLength = Len(sec1)
            sec2.nLength = Len(sec2)
            start.cb = Len(start)
            start.dwFlags = STARTF_USESHOWWINDOW
            start.lpReserved = vbNullString
            start.cbReserved2 = 0
            start.lpReserved2 = 0
            start.wShowWindow = enSW.SW_NORMAL
            strCommandLine = ReplaceStrNull(strResult) + " " + ReplaceStrNull(sFileName)
            rc = CreateProcess(vbNullString, strCommandLine, sec1, sec2, False, NORMAL_PRIORITY_CLASS, ByVal 0, vbNullString, start, proc)
            IThreadId = proc.dwThreadId
            EnableHook
         End If
        
         Super_Shell = rc
        
        Exit Function
        
    ErrProc:
        
        Super_Shell = 0
        MsgBox "打开文件出错,错误信息:" + Err.Description, vbOKOnly + vbExclamation, "提示"
        
    End Function'替换字符串中的空字符 vbnullchar
    Public Function ReplaceStrNull(ByVal strSrc As String) As String
        Dim i           As Integer
        Dim str         As String
        Dim strDesc     As String
        str = ""
        strDesc = ""
        For i = 1 To Len(strSrc)
            str = Mid(strSrc, i, 1)
            If Asc(str) <> 0 Then
                strDesc = strDesc + str
            End If
        Next i
        ReplaceStrNull = strDesc
        
    End Function
    调用 Super_Shell "d:\tt.txt"运行发现钩子没有设置成功,在enableHook中调用getlasterror 返回 87 -- 参数类型不匹配,那位能帮我查查原因,谢谢了