试试看Form1代码:Option Explicit Private Sub Form_Load() Call Hook(Text1.hWnd) End SubPrivate Sub Form_Unload(Cancel As Integer) Call UnHook End SubModel1代码: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 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 Public Const WM_RBUTTONUP = &H205 Public lpPrevWndProc As Long Private lngHWnd As LongPublic Sub Hook(hWnd As Long) lngHWnd = hWnd lpPrevWndProc = SetWindowLong(lngHWnd, GWL_WNDPROC, AddressOf WindowProc) End SubPublic Sub UnHook() Dim lngReturnValue As Long lngReturnValue = SetWindowLong(lngHWnd, GWL_WNDPROC, lpPrevWndProc) End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, _ ByVal wParam As Long, ByVal _ lParam As Long) As Long Select Case uMsg '检测鼠标击键消息,如果是单击右键 Case WM_RBUTTONUP '什么事也不做或弹出自己定制的菜单 ' MsgBox "right button clicked." Exit Function Case Else WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) End Select End Function
SoHo_Andy(冰) 你的方法可行,但无法解决ctrl+v等快键问题。
解决快捷键问题Dim strTemp As String Dim isCtrl As Boolean Private Sub Form_Load() isCtrl = False End SubPrivate Sub Text1_Change() If isCtrl = True Then Text1.Text = strTemp isCtrl = False End If End SubPrivate Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyControl Then isCtrl = True strTemp = Text1.Text End If End Sub
呵呵,你再判断按v键时,ctrl键是否被按下 Text1_KeyDown(KeyCode As Integer, Shift As Integer) 用shift (shift and 2)=2 表示按了ctrl
1. 屏蔽Windows弹出菜单 2. 当该控件获得焦点时清空剪贴板
拦截掉文本框的WM_Copy、WM_Cut、WM_Paste消息
将 SoHo_Andy(冰) 的“Model1”模块中的代码改成: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 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 = -4Private Const WM_CUT As Long = &H300 Private Const WM_COPY As Long = &H301 Private Const WM_PASTE As Long = &H302Public lpPrevWndProc As Long Private lngHWnd As LongPublic Sub Hook(hWnd As Long) lngHWnd = hWnd lpPrevWndProc = SetWindowLong(lngHWnd, GWL_WNDPROC, AddressOf WindowProc) End SubPublic Sub UnHook() Dim lngReturnValue As Long lngReturnValue = SetWindowLong(lngHWnd, GWL_WNDPROC, lpPrevWndProc) End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, _ ByVal wParam As Long, ByVal _ lParam As Long) As Long Select Case uMsg Case WM_CUT,WM_COPY,WM_PASTE Exit Function Case Else WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) End Select End Function
text1.enable=False
text1.enable=true
Private Sub Form_Load()
Call Hook(Text1.hWnd)
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call UnHook
End SubModel1代码: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 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
Public Const WM_RBUTTONUP = &H205
Public lpPrevWndProc As Long
Private lngHWnd As LongPublic Sub Hook(hWnd As Long)
lngHWnd = hWnd
lpPrevWndProc = SetWindowLong(lngHWnd, GWL_WNDPROC, AddressOf WindowProc)
End SubPublic Sub UnHook()
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(lngHWnd, GWL_WNDPROC, lpPrevWndProc)
End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal _
lParam As Long) As Long
Select Case uMsg
'检测鼠标击键消息,如果是单击右键
Case WM_RBUTTONUP
'什么事也不做或弹出自己定制的菜单
' MsgBox "right button clicked."
Exit Function
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Select
End Function
Dim isCtrl As Boolean
Private Sub Form_Load()
isCtrl = False
End SubPrivate Sub Text1_Change()
If isCtrl = True Then
Text1.Text = strTemp
isCtrl = False
End If
End SubPrivate Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyControl Then
isCtrl = True
strTemp = Text1.Text
End If
End Sub
Text1_KeyDown(KeyCode As Integer, Shift As Integer)
用shift (shift and 2)=2 表示按了ctrl
2. 当该控件获得焦点时清空剪贴板
Public 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 = -4Private Const WM_CUT As Long = &H300
Private Const WM_COPY As Long = &H301
Private Const WM_PASTE As Long = &H302Public lpPrevWndProc As Long
Private lngHWnd As LongPublic Sub Hook(hWnd As Long)
lngHWnd = hWnd
lpPrevWndProc = SetWindowLong(lngHWnd, GWL_WNDPROC, AddressOf WindowProc)
End SubPublic Sub UnHook()
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(lngHWnd, GWL_WNDPROC, lpPrevWndProc)
End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal _
lParam As Long) As Long
Select Case uMsg
Case WM_CUT,WM_COPY,WM_PASTE
Exit Function
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Select
End Function
1. 屏蔽Windows弹出菜单
2. 当该控件获得焦点时清空剪贴板
这种方法有没有实例?Thanks
If Button = 2 Then MsgBox "无效点击"End Sub这样满足你要求吗?
Clipboard.Clear '清除剪贴板内容
在快捷键中再进行一次判断不就行了?