![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
No.2ベストアンサー
- 回答日時:
#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.3
- 回答日時:
#2 の続きです。
サブクラス化に自信がなければ、ダミーのコンテキストメニューを割り当てるという方法もあります。言うまでもなく、こちらの方がずっと容易です。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス 意図せずサブプロシージャを移動してしまうのを止めたい 1 2022/09/02 09:19
- Chrome(クローム) 【 Chrome 】鎖のアイコンの「Copy Link Text」が機能しなくなりました。 1 2023/03/27 10:32
- Word(ワード) Wordで図形などの全てのオブジェクトの位置を一括で固定する方法はありますか? 1 2022/04/19 14:29
- Excel(エクセル) [貼り付けオプション]とは? 3 2022/04/17 08:15
- Windows 10 Windows10画像選択時コンテキストメニューで「右に回転」のアクセスキー(T)を変更したい 1 2022/04/17 11:06
- Visual Basic(VBA) Excel VBA ユーザーフォーム内のラベルにテキストボックスの小計を出す方法 5 2022/08/17 14:27
- Visual Basic(VBA) テキストボックス1の値に対するテキストボックス2に表示する値 1 2022/04/05 14:35
- Windows 10 デスクトップにファイルを保存すると既存のファイルアイコンの列に割り込むように保存されて困ってます 2 2022/04/25 19:00
- HTML・CSS 【html】検索ボックスを作りたい 4 2022/04/02 17:25
- その他(パソコン・スマホ・電化製品) ワードでテキストボックス内の文字を連動させない方法 2 2023/02/09 16:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vbaから他のアプリを終了
-
他のウィンドウのボタンを自動...
-
SetWindowText関数について
-
チェックボックスのキーダウン...
-
DEVICECHANGE() の受け取り
-
メッセージハンドラ
-
テキストボックスでコンテキス...
-
msgboxの表示位置
-
CloseHandle()
-
メッセージボックスの選択ボタ...
-
モーダルウインドウとモードレ...
-
Sendkeysのタイミング
-
VB.netでSendMessageを使用して...
-
VBでRegisterWindowMessage関数...
-
マウスの状態の取得
-
Excel VBA で外部アプリケーシ...
-
VBA 複数セルが空白なら印刷さ...
-
WM_CLEARなど使えないメッセー...
-
VBAでコントロールのハンドルを...
-
windows終了時のメッセージにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
他のウィンドウのボタンを自動...
-
msgboxの表示位置
-
メッセージボックスの選択ボタ...
-
VBAでコントロールのハンドルを...
-
メッセージハンドラ
-
SetWindowText関数について
-
VB.netでFindWindowExやると・...
-
CloseHandle()
-
SendMessage で ESC など
-
VBA 複数セルが空白なら印刷さ...
-
デスクトップ上のアイコンの位...
-
点滅で知らせる方法
-
WM_NCLBUTTONUPについて
-
システム例外のメッセージを変...
-
Excel VBA で外部アプリケーシ...
-
VB6でシャットダウン、ログオフ...
-
ElseIfの使い方。
-
WM_CTLCOLORDLG
-
VB.netでSendMessageを使用して...
おすすめ情報