我做了一个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次,而且是先有程序崩溃,再有我改程序记录消息的我实在是想不出原因了,请指教,谢谢!
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次,而且是先有程序崩溃,再有我改程序记录消息的我实在是想不出原因了,请指教,谢谢!
解决方案 »
- 高分求题解(1/3)!!!
- 请问:GetCurrentProcessID OpenProcessToken LookupPrivilegeValue AdjustTokenPrivileges 怎么用啊
- 谁知道写INI文件的函数?
- 我是大连的编程菜鸟,My QQ:9227066 My Tel:0411-2113485
- 一个驱动级读取内存的问题!高手入
- 如何用adodc1.recordset.update更新指定位置的记录?
- ado连接mssql问题
- 请教 VB连SQLServer 日期类数据查询
- 哪位高手有做过VB与运动控制卡或轴控卡,请发几个例子!谢谢!
- 什么叫作无模式窗体?什么叫作模式窗体?两者有何区别?
- Function的问题
- 怎么把客户端的access数据定时读到服务器里
而且不应该 Exit Function,否则文件打开了没关闭。又:直接用 VB 的 Append 模式写文件,比频繁使用 FSO 要快。