我是這個論壇的新手,所以在此先感謝您對此主題的幫助。訪問表單子類捕獲WM_MOVING郵件
我試圖解決我認爲是一個古老的Access窗體問題。我正在開發一個數據庫,在這個數據庫中,彈出式主表單打開了我想要保留在主表單邊框內的其他幾個彈出窗體。當主窗體移動或調整大小時,我需要相應地移動並調整其他打開的窗體的大小。我基本上試圖讓我的數據庫看起來類似於一個主窗體有幾個子窗體的實際應用程序。
我使用事件Detail_Paint()來檢測主窗體的大小是否改變,以調整其他窗體的大小,它似乎工作。但是在屏幕上沒有與該移動相關的事件。 MouseMove()似乎不起作用,因爲當用戶在表單標題上移動鼠標光標時,它不會觸發。我已經用一個定時器解決了這個問題,該定時器每10毫秒檢查一次主窗體的位置並相應地改變其他窗體的位置。但是,這會導致顯示器出現令人討厭的閃爍,並且在用戶在控件中輸入文字時也會出現問題。
我讀過,可以子窗體和捕獲WM_MOVING消息到窗口。我爲此開發了一些測試代碼,但是當我嘗試運行它時,Access停止工作,我必須使用任務管理器關閉它。我在Windows 10 64位系統上使用Access 2016 Professional 64位。
這是我寫到目前爲止的代碼。
' This code goes into a general module (mdl_subclass)
' When subclassing shows the coordinates of the window in its caption
Option Explicit
Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" _
(ByVal hWnd As LongPtr, _
ByVal nIndex As LongPtr, _
ByVal dwNewLong As LongPtr) As LongPtr
Declare PtrSafe Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As LongPtr, _
ByVal hWnd As LongPtr, _
ByVal Msg As LongPtr, _
ByVal wParam As LongPtr, _
ByVal lParam As LongPtr) As LongPtr
Public Const GWL_WNDPROC = (-4)
Private Const WM_MOVE = &H3
Dim m_PrevProc As LongPtr
Public Sub SubClass_On(ByVal hWnd As Long)
m_PrevProc = SetWindowLongPtr(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub SubClass_Off(ByVal hWnd As Long)
SetWindowLongPtr hWnd, GWL_WNDPROC, m_PrevProc
End Sub
Private Function WindowProc(ByVal hWnd As LongPtr, ByVal uMsg As LongPtr, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
WindowProc = CallWindowProc(m_PrevProc, hWnd, uMsg, wParam, lParam)
If uMsg = WM_MOVE Then
Form_frm_main.Me_OnMove lParam And CLng(&HFFFF&), lParam \ CLng(&HFFFF&)
End If
End Function
' This code instead goes into the form module, starts subclassing on form loading and stop subclassing on form unload
Private Sub Form_Load()
SubClass_On Me.hWnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
SubClass_Off Me.hWnd
End Sub
Friend Sub Me_OnMove(ByVal xPos As Long, ByVal yPos As Long)
Me.Caption = "x=" & xPos & "; y=" & yPos
End Sub
...有關如何解決我的代碼的任何想法?或者對我的問題有其他建議嗎?
謝謝
您的聲明是錯誤的,nIndex和Msg是長。 –