سلام
راههای مختلفی وجود دارد، که مطمئن ترین آنها sub-classing است
برای اینکار یک ماژول به برنامه اضافه و کدهای زیر را در آن کپی کنید:
Option Explicit
Private 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
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Private lPProc&
Public Sub OldWindowProc(tTextBox As TextBox)
lPProc& = SetWindowLong(tTextBox.hWnd, GWL_WNDPROC, AddressOf NoPopupWindowProc)
End Sub
Private Function NoPopupWindowProc(ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_CONTEXTMENU = &H7B
Const WM_DESTROY = &H2
If msg = WM_CONTEXTMENU Then
Exit Function
ElseIf msg = WM_DESTROY Then
SetWindowLong hWnd, GWL_WNDPROC, lPProc&
Else
NoPopupWindowProc = CallWindowProc(lPProc&, hWnd, msg, wParam, lParam)
End If
End Function
استفاده:
Private Sub Form_Load()
Call OldWindowProc(Text1)
End Sub
البته توجه داشته باشین که در استفاده از توابع هوک احتمال بسته شدن ناگهانی وی بی وجود دارد، پس برای جلوگیری از این اتفاق حتما از دستور unload یا فشردن کلید Close برای بستن برنامه استفاده کنید تا دستور یا دکمه End
موفق باشید