Liu 板


LINE

看板 Liu  RSS
我先前提到自動偵測加字加詞檔,一旦有變更就立即重載的方法, 今天突然想到就拿我的原始碼去參考就好了嘛… 這方法應該不會佔平時 CPU/硬碟多少時間,不知道 luke 大能不能接受… chkMonitorLiuBox 在打勾後就設定 tmrRunMonitor enable,Interval 只設 1ms, tmrRunMonitor 一引發,立刻設 disable,其實只是為了要有 MultiThread 的效果, 不要將主視窗卡死而已,並不是每 1ms 都做一次檔案變更檢查。 MonitorLiuBox() 會在 MsgWaitForMultipleObjects 的 Do Loop 一直繞而不脫離, 平時以 DoEvents 處理視窗訊息,遇到 WAIT_OBJECT_0 就代表目錄內有檔案變更, 接下來再次確定 liu.box 有變更之後,就可以處理需要的動作。 底下的程式碼當然無法直接運作,有需要的話再看我怎麼提供。 tmrRunMonitor.Interval = 1 Private Sub chkMonitorLiuBox_Click() Debug.Print "chk start" If chkMonitorLiuBox.Value = vbChecked Then If Not FileExist(GetLiuBoxPath) Then MsgBox "嘸蝦米加字加詞檔不存在: " & GetLiuBoxPath, , App.Title chkMonitorLiuBox.Value = vbUnchecked Debug.Print "chk end" Exit Sub End If If g_Monitoring Then Exit Sub tmrRunMonitor.Enabled = True Else If Not g_Monitoring Then Exit Sub g_Quit = True End If Debug.Print "chk end" mnuMonitorLiuBox.Checked = _ IIf(chkMonitorLiuBox.Value = vbChecked, True, False) End Sub Private Sub tmrRunMonitor_Timer() Debug.Print "tmr start" tmrRunMonitor.Enabled = False MonitorLiuBox Debug.Print "tmr end" End Sub Private Declare Function FindFirstChangeNotification Lib "kernel32" Alias _ "FindFirstChangeNotificationA" (ByVal lpPathName As String, _ ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long Private Declare Function FindNextChangeNotification Lib "kernel32" _ (ByVal hChangeHandle As Long) As Long Private Declare Function FindCloseChangeNotification Lib "kernel32" _ (ByVal hChangeHandle As Long) As Long Private Const FILE_NOTIFY_CHANGE_ATTRIBUTES = &H4 '屬性改變 Private Const FILE_NOTIFY_CHANGE_DIR_NAME = &H2 '建立 刪除 或更名資料夾 Private Const FILE_NOTIFY_CHANGE_FILE_NAME = &H1 '建立 刪除 或更名檔名 Private Const FILE_NOTIFY_CHANGE_LAST_WRITE = &H10 '檔案最後寫入時間改變 Private Const FILE_NOTIFY_CHANGE_LAST_ACCESS = &H20 '檔案最後存取時間改變 Private Const FILE_NOTIFY_CHANGE_CREATION = &H40 '檔案建立時間改變 Private Const FILE_NOTIFY_CHANGE_SECURITY = &H100 '檔案或目錄的安全屬性改變 Private Const FILE_NOTIFY_CHANGE_SIZE = &H8 '檔案大小改變 Private Declare Function MsgWaitForMultipleObjects Lib "user32" _ (ByVal nCount As Long, pHandles As Long, ByVal fWaitAll As Long, _ ByVal dwMilliseconds As Long, ByVal dwWakeMask As Long) As Long Private Const INFINITE = &HFFFF Private Const QS_POSTMESSAGE = &H8 Private Const QS_SENDMESSAGE = &H40 Private Const QS_TIMER = &H10 Private Const QS_PAINT = &H20 Private Const QS_KEY = &H1 Private Const QS_HOTKEY = &H80 Private Const QS_MOUSEBUTTON = &H4 Private Const QS_MOUSEMOVE = &H2 Private Const QS_MOUSE = (QS_MOUSEMOVE Or QS_MOUSEBUTTON) Private Const QS_INPUT = (QS_MOUSE Or QS_KEY) Private Const QS_ALLEVENTS = (QS_INPUT Or QS_POSTMESSAGE Or QS_TIMER Or _ QS_PAINT Or QS_HOTKEY) Private Const QS_ALLINPUT = (QS_SENDMESSAGE Or QS_PAINT Or QS_TIMER Or _ QS_POSTMESSAGE Or QS_MOUSEBUTTON Or QS_MOUSEMOVE Or QS_HOTKEY Or _ QS_KEY) Private Const STATUS_WAIT_0 = &H0& Private Const WAIT_OBJECT_0 = ((STATUS_WAIT_0) + 0) Private Const INVALID_HANDLE_VALUE = -1 Dim hNotify(2) As Long Public g_Quit As Boolean Public g_WindowClose As Boolean Public g_Monitoring As Boolean Public Sub MonitorLiuBox() Dim LiuBoxLastTime As Date Dim dwResult As Long, nCount As Long On Error GoTo EndProcess2 Debug.Print "monitor start" g_Monitoring = True LiuBoxLastTime = FileDateTime(GetLiuBoxFilePath) On Error GoTo EndProcess1 hNotify(0) = FindFirstChangeNotification _ (GetLiuBoxPath, 0, FILE_NOTIFY_CHANGE_LAST_WRITE) If hNotify(0) <> INVALID_HANDLE_VALUE Then Do dwResult = MsgWaitForMultipleObjects _ (1, hNotify(0), False, INFINITE, QS_ALLINPUT) If (dwResult = WAIT_OBJECT_0) Then If LiuBoxLastTime < FileDateTime(GetLiuBoxFilePath) Then LiuBoxLastTime = FileDateTime(GetLiuBoxFilePath) Debug.Print "liu.box changed" frmMain.cmdReopen_Click End If FindNextChangeNotification hNotify(0) End If DoEvents Loop While (Not g_Quit) End If If Err.Number <> 0 Then End If EndProcess1: FindCloseChangeNotification hNotify(0) EndProcess2: If Not g_WindowClose Then frmMain.chkMonitorLiuBox.Value = vbUnchecked End If g_Quit = False g_Monitoring = False Debug.Print "monitor stop" End Sub -- ChrisTorng http://groups.msn.com/ChrisTorng ChrisTorng 樣式訊息記錄 V2.1 正式推出 http://groups.msn.com/ChrisTorng/msn6messagelog.msnw --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.75.28.114







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP