#1さんご提示の通り、サブクラス化を使います。
ちょっとむずかしいですが、サンプルコードを提示しておきます。
※ タグが使えませんのでインデントが潰れています。読みにくいと思いますが、気合で読んでください。(^-^;
※ マルチインスタンスには対応していません。複数のコントロールをサブクラス化する場合、コンポーネント化する場合は変更が必要です。
Option Explicit
'API関数の宣言
Public Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public 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 Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_CONTEXTMENU = &H7B 'ショートカットメニュー
Public Const WM_COPY = &H301 'コピー
Public Const WM_CUT = &H300 '切り取り
Public Const WM_PASTE = &H302 '張り付け
Public Const WM_RBUTTONUP = &H205 '右ボタンUp
Public ghWnd As Long
Public Sub Hook(hwnd As Long)
'テキストボックスのサブクラス化。
ghWnd = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WndProc)
End Sub
Public Sub UnHook(hwnd As Long)
'サブクラス化解除。
Dim lngret As Long
If ghWnd <> 0 Then
lngret = SetWindowLong(hwnd, GWL_WNDPROC, ghWnd)
End If
End Sub
Public Function WndProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
'メッセージフック。
Select Case uMsg
Case WM_CONTEXTMENU 'ショートカットメニューの無効化。
Case WM_CUT, WM_PASTE, WM_RBUTTONUP 'カット & ペースト、右クリックの無効化。
'特定のコントロールの場合のみメッセージをフック。
If Screen.ActiveControl.Name <> "txtFoo" Then
WndProc = CallWindowProc(ghWnd, hwnd, uMsg, wParam, lParam)
End If
Case Else
WndProc = CallWindowProc(ghWnd, hwnd, uMsg, wParam, lParam)
End Select
End Function
'↓以下、フォームモジュール。
Private Sub Form_Load()
'テキストボックスをサブクラス化。
Call Hook(Me.txtHoge.hwnd)
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'サブクラス化解除。
Call UnHook(Me.txtHoge.hwnd)
End Sub
お礼
わざわざコードを書いてくれてありがとうございます!!サブクラス化をがんばってやってみようと思います。
補足
ダミーのコンテキストメニューを割り当てるというのはNO.1のかたがおしえてくれてURLに載っているようなことのことでしょうか?