通过API函数屏蔽Flash的右键菜单(或者自定义Flash右键菜单)


通过API函数屏蔽Flash的右键菜单(或者自定义Flash右键菜单)


        [前提]:针对Flash的右键菜单,始终是我困惑之处,一直没解决掉,不得已,上CSDN问了问,居然很快就得到了解决,同时还可以将Flash的右键菜单换成自己的,先将该网有的帖子整理出来,以方便将来查找。

源问题帖地址:http://community.csdn.net/Expert/topic/4356/4356809.xml?temp=.9871179

API 屏蔽鼠标右键


模块文件
___________________________________________________________________________
Option Explicit
Public Const WM_RBUTTONDOWN = &H204
Public Const GWL_WNDPROC = (-4)
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
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal lhWnd As Long, ByVal lpClassName As String, ByVal lMax As Long) As Long
Public prevProc As Long
Public flaHwnd As Long
Public Sub Hook(ByVal hwnd As Long)
    prevProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WndProc)
End Sub
Public Sub UnHook(ByVal hwnd As Long)
    If prevProc <> GetWindowLong(hwnd, GWL_WNDPROC) Then
       Call SetWindowLong(hwnd, GWL_WNDPROC, prevProc)
    End If
End Sub
Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wp As Long, ByVal lp As Long) As Long
    Select Case uMsg
        Case WM_RBUTTONDOWN
            frmMain.PopupMenu frmMain.mnuPOP, 2
        Case Else
            WndProc = CallWindowProc(prevProc, hwnd, uMsg, wp, lp)
            Exit Function
    End Select
    WndProc = True
End Function


Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
    '这个回调函数通过过滤所有的子窗口的类名,来判断是不是 Flash 控件,
    '如果 Form 里的控件(子窗口)太多的话一定会影响启动速度的。我发现
    '这个函数是从 TabIndex 最大的控件开始过滤的,也就是说,如果在设计
    '窗体界面的时候最后才放置 Flash 控件的话,你就会第一个找到它的句柄
    '了。而且 Flash 控件的类名会随着它的版本的不同而不同,所以我就用了
    '一个 Like 语句。8.0竟然叫MacromediaFlashPlayerActiveX
    If GetClsName(hwnd) Like "ATL:????????" Or GetClsName(hwnd) Like "MacromediaFlashPlayerActiveX" Then
        flaHwnd = hwnd
        Hook flaHwnd
        EnumChildProc = 0
    Else
        EnumChildProc = 1
    End If
End Function
Public Function GetClsName(ByVal hwnd As Long) As String
    Dim xLen As Long
    Dim sBuffer As String
    sBuffer = String(255, 0)
    xLen = GetClassName(hwnd, sBuffer, 255)
    If xLen = 0 Then
        GetClsName = ""
    Else
        GetClsName = Left(sBuffer, xLen)
    End If
End Function
___________________________________________________________________________

 


调用事例 窗体


____________________________________________________________________________
Option Explicit

Private Sub Form_Load()

    Dim ret As Long

    Me.Caption = Me.Caption & " - [" & App.Major & "." & App.Minor & "." & App.Revision & "]"
    ret = EnumChildWindows(Me.hwnd, AddressOf EnumChildProc, ByVal 0&)

End Sub

Private Sub Form_Resize()

    Flash.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight

End Sub

Private Sub Form_Unload(Cancel As Integer)

    UnHook flaHwnd

End Sub
______________________________________

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值