ACCESSにおけるマウスホイールのキャンセル
accessにおいてフォームの中にサブフォームを単票フォームで作ると、どうしてもサブフォームの上でマウスをホイールすると新規レコードに移ってしまう。
この問題がずーと解決できずにいました。
しかし、先日それを解決出来る方法を見つけましたので、自分のブログに忘れないように記載しておこうと思います。
1.AccessのVBE画面を表示します。
2.メニューから挿入(I)→クラスモジュール(C)を実行します。
プロジェクトエクスプローラにClass1が挿入されます。
Class1モジュールの名前をCMouseWheelに変更します3.クラスモジュールに貼り付けるコード
Private frm As Object
Private intCancel As Integer
Public Event MouseWheel(Cancel As Integer)Public Property Set Form(frmIn As Object)
Set frm = frmIn
End PropertyPublic Property Get MouseWheelCancel() As Integer
MouseWheelCancel = intCancel
End PropertyPublic Sub SubClassHookForm()
lpPrevWndProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, AddressOf WindowProc)
Set CMouse = Me
End SubPublic Sub SubClassUnHookForm()
Call SetWindowLong(frm.hwnd, GWL_WNDPROC, lpPrevWndProc)
End SubPublic Sub FireMouseWheel()
RaiseEvent MouseWheel(intCancel)
End Sub4.メニューから挿入(I)→標準モジュール(M)を実行します。
プロジェクトエクスプローラにModule1(環境により変わる)が挿入されます。5.(標準モジュールに貼り付けるコード)貼り付けます。その際
Public CMouse As CMouseWheel
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, _
ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Const GWL_WNDPROC = -4
Public Const WM_MouseWheel = &H20A
Public lpPrevWndProc As LongPublic Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_MouseWheel
CMouse.FireMouseWheel
If CMouse.MouseWheelCancel = False Then
WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End If
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End Select
End Function6.マウスのホイールを無効にしたいフォームに下記コードを記述する
Private WithEvents clsMouseWheel As CMouseWheel
Private Sub Form_Load()
Set clsMouseWheel = New CMouseWheel
Set clsMouseWheel.Form = Me
clsMouseWheel.SubClassHookForm
End SubPrivate Sub Form_Close()
clsMouseWheel.SubClassUnHookForm
Set clsMouseWheel.Form = Nothing
Set clsMouseWheel = Nothing
End SubPrivate Sub clsMouseWheel_MouseWheel(Cancel As Integer)
'MsgBoxがいらなければ以下の行を削除します。
MsgBox "マウスホイール使用不可"
Cancel = True
End Sub8.VBE画面を閉じ、データベースウインドウからモジュールを選択します。
9.Accessを一旦閉じます。
これにより、mds-rapsのプログラムは完成することができそうです