我做了一个MDI程序,其中有一个子窗体,名为FrmMenuTree,MdiChild属性为True,窗体中有如下程序:
 Private Sub Form_Load()    '此处省略    SetWindowLong hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) Or WS_EX_NOPARENTNOTIFY
    SetProp hWnd, "OldWndProc", SetWindowLong(hWnd, GWL_WNDPROC, AddressOf myMenuTreeProc)
    
    MsgBox GetWindowLong(hWnd, GWL_STYLE)     '此处省略End SubPrivate Sub Form_Unload(Cancel As Integer)
    IsUnloading = 1   '改变标示,开始记录消息
End Sub模块中有如下程序:
Public Function myMenuTreeProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long    On Error GoTo Err    Dim fso As FileSystemObject
    Dim ff As TextStream
    Dim s As String
    
    '如果有此标示,则把消息保存到外部文件
    If IsUnloading = 1 Then
        Set fso = New FileSystemObject
        Set ff = fso.CreateTextFile(App.Path & IIf(Right(App.Path, 1) = "\", "", "\") & "\MenuTreeProcLog.txt", True)
        IsUnloading = 2
        ff.WriteLine Hex(Msg) & vbTab & Hex(wp) & vbTab & Hex(lp) & vbTab & Now
    ElseIf IsUnloading = 2 Then
        Set fso = New FileSystemObject
        Set ff = fso.OpenTextFile(App.Path & IIf(Right(App.Path, 1) = "\", "", "\") & "\MenuTreeProcLog.txt", ForAppending)
        ff.WriteLine Hex(Msg) & vbTab & Hex(wp) & vbTab & Hex(lp) & vbTab & Now
    End If
    
    '此处省略    myMenuTreeProc = CallWindowProc(GetProp(hWnd, "OldWndProc"), hWnd, Msg, wp, lp)
        
    If Msg = WM_DESTROY Then
                
        SetWindowLong hWnd, GWL_WNDPROC, GetProp(hWnd, "OldWndProc")        
        Exit Function
        
    End If
    
    '完成消息后,保存该消息和OK字样
    If IsUnloading = 2 Then
        ff.WriteLine Hex(Msg) & vbTab & Hex(wp) & vbTab & Hex(lp) & vbTab & "OK"
        ff.Close
        Set ff = Nothing
        Set fso = Nothing
    End If
    
    Exit Function
    
Err:
    '    
End Function我希望实现的效果是,点击X关闭窗体后,开始记录之后的消息
成功的话,会在文件中记录大概10条左右的消息和它们对应的OK字样
但是有的时候会失败,程序会崩溃,在文件中除了记录与成功时相同的消息外,还有多出N次&H210和&H2消息,即程序在反复执行210和2消息,其中210消息为:WM_PARENTNOTIFY然而,我已经在Form_Load中指定了WS_EX_NOPARENTNOTIFY = &H4- 创建/销毁时不通知父窗口,而且MsgBox出的内容是:460000004,说明该风格已经加上
但是关闭子窗体时仍然在执行210消息以上情况不是100%出,大概3、4次会有1次,而且是先有程序崩溃,再有我改程序记录消息的我实在是想不出原因了,请指教,谢谢!