none
给窗体风格加上WS_EX_NOPARENTNOTIFY后为什么没有效果? RRS feed

  • 问题

  • 我做了一个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 Sub

    Private 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次,而且是先有程序崩溃,再有我改程序记录消息的

    我实在是想不出原因了,请指教,谢谢!

    2009年10月22日 9:13