我试了,一定行,效果不错 Private Sub SSTab1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If MsgBox("是否切换?", vbYesNo + vbExclamation, "提示") = vbYes Then SSTab1.Tab = 2 Else SSTab1.Tab = 0 End If End Sub
模块: Option Explicit Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long 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 LongDeclare Function SetWindowLong _ Lib "user32" Alias "SetWindowLongA" _ (ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Public Const MB_YESNO = &H4& Public Const WM_USER = &H400 Public Const TAB_NCCLICK = WM_USER + 300 Public Const GWL_WNDPROC = -4 Public flag As Long Global lpPrevWndProc As Long Dim i As Long Public Sub Hook(ByVal hwnd As Long) lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc) End SubPublic Sub UnHook(ByVal hwnd As Long) Dim lngReturnValue As Long lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, lpPrevWndProc) End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim hMenu As Long, i As Long Select Case uMsg Case TAB_NCCLICK If MsgBox("是否切换?", vbYesNo + vbExclamation, "提示") = vbYes Then WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) Else Debug.Print "haha" End If Case Else WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) End Select End Function窗体(有一个sstab控件): Option ExplicitPrivate Sub Form_Load() Hook SSTab1.hwnd End SubPrivate Sub Form_Unload(Cancel As Integer) UnHook SSTab1.hwnd End Sub注意,编译成p-代码后再测试
Private Sub SSTab1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If MsgBox("是否切换?", vbYesNo + vbExclamation, "提示") = vbYes Then SSTab1.Tab = 2 Else SSTab1.Tab = 0 End If End Sub
Private Sub SSTab1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If MsgBox("是否切换?", vbYesNo + vbExclamation, "提示") = vbYes Then
SSTab1.Tab = 2
Else
SSTab1.Tab = 0
End If
End Sub
1:点“否”没用,还是切过去了
2:我希望只在点选项卡的时候才报msg,而不是点整个sstab时
3:不只是在选项卡0和2之间切换,而是任意两个之间
Option Explicit
Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
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 LongDeclare Function SetWindowLong _
Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Const MB_YESNO = &H4&
Public Const WM_USER = &H400
Public Const TAB_NCCLICK = WM_USER + 300
Public Const GWL_WNDPROC = -4
Public flag As Long
Global lpPrevWndProc As Long
Dim i As Long
Public Sub Hook(ByVal hwnd As Long)
lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End SubPublic Sub UnHook(ByVal hwnd As Long)
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, lpPrevWndProc)
End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim hMenu As Long, i As Long
Select Case uMsg
Case TAB_NCCLICK
If MsgBox("是否切换?", vbYesNo + vbExclamation, "提示") = vbYes Then
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
Else
Debug.Print "haha"
End If
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Select
End Function窗体(有一个sstab控件):
Option ExplicitPrivate Sub Form_Load()
Hook SSTab1.hwnd
End SubPrivate Sub Form_Unload(Cancel As Integer)
UnHook SSTab1.hwnd
End Sub注意,编译成p-代码后再测试
1.只在点选项卡的时候才报msg,而不是点整个sstab时
2.点当前激活的选项卡时不报,当切换时才报
If MsgBox("是否切换?", vbYesNo + vbExclamation, "提示") = vbYes Then
SSTab1.Tab = 2
Else
SSTab1.Tab = 0
End If
End Sub