我正在尝试使用 FindFirstChangeNotification 查看目录的变化功能。如果我获取 FindFirstChangeNotification 返回的句柄并将其填充到 WaitForSingleObject 中,这将起作用。问题是 WaitForSingleObject 会阻塞整个应用程序,直到它返回。
所以,我环顾四周,似乎RegisterWaitForSingleObject是要走的路:
Sub monitorDir(dir As FolderItem)
Declare Function FindFirstChangeNotificationW Lib "Kernel32" (dirPath As WString, watchChildren As Boolean, eventTypeFilter As Integer) As Integer
Declare Function RegisterWaitForSingleObject Lib "Kernel32" (ByRef waiterHWND As Integer, HWND As Integer, cllbck As Ptr, _
context As Integer, wait As Integer, flags As Integer) As Integer
Dim allFilters As Integer = &h00000001 Or &h00000002 Or &h00000004 Or &h00000008 Or &h00000010_
Or &h00000100
Dim monitorHandle As Integer = FindFirstChangeNotificationW(dir.AbsolutePath, True, allFilters)
If monitorHandle <> 0 Then
Call RegisterWaitForSingleObject(myCallbackHWND, monitorHandle, AddressOf MyCallbackFn, 0, &hFFFFFFFF, 0)
End Sub
这似乎在应用程序继续正常执行时起作用。但是,一旦调用 MyCallbackFn(即目录中发生更改时),事情就会变得……很奇怪。使用 Process Explorer 和 Windows Explorer 时,应用程序开始崩溃或锁定。我必须退出 Windows 才能恢复内容。
目前,MyCallbackFn 所做的就是:
Sub MyCallbackFn()
Declare Function UnregisterWaitEx Lib "Kernel32" (waitHWND As Integer, eventHandle As Integer) As Integer
Call UnregisterWaitEx(myCallbackHWND, 0)
MsgBox("Change Detected")
End Sub
我是不是用 RegisterWaitForSingleObject 找错了树,是我用错了,还是 RealBasic 中有一些限制导致回调崩溃系统?
最佳答案
您在 RegisterWaitForSingleObject()
中注册的回调函数在另一个线程 (http://msdn.microsoft.com/zh-cn/library/ms685061.aspx) 上调用:
The callback routine is executed by a worker thread when the object's state becomes signaled or the time-out interval elapses.
我对 RealBasic 的线程支持一无所知,但至少 Windows 上的 GUI 操作通常需要在特定线程上发生,而不仅仅是任何旧的工作线程。因此,在该工作线程上调用 MsgBox()
可能是一个问题。
您可以尝试的一个简单方法是调用 PostMessage()
(或任何 RealBasic 等效项)将自定义消息发布到您的应用程序可以响应的窗口消息队列(例如通过调用 MsgBox()
)。
关于windows - RegisterWaitForSingleObject 使用 RealBasic 监视目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5599169/