如题,
    VB中调用的Flash控件没有句柄,我想完完全全屏蔽掉Flash的右键菜单,在VB程序中,请问该怎么做?给个思路或贴出源码进行分析都可。
    谢谢。

解决方案 »

  1.   

    方法有很多:
    1 将Flash控件放入picturebox中,屏蔽picturebox的右键(这个很简单,你应该会吧)2 从flash控件提供的事件入手(好象成功率不高)3 用exescope等资源修改工具删除对应ocx文件的右键菜单(比较暴力)其它的请楼下补充
      

  2.   

    方法有很多:
    1 将Flash控件放入picturebox中,屏蔽picturebox的右键(这个很简单,你应该会吧)2 从flash控件提供的事件入手(好象成功率不高)3 用exescope等资源修改工具删除对应ocx文件的右键菜单(比较暴力)其它的请楼下补充
      

  3.   

    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 ExplicitPrivate 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 SubPrivate Sub Form_Resize()    Flash.Move 0, 0, Me.ScaleWidth, Me.ScaleHeightEnd SubPrivate Sub Form_Unload(Cancel As Integer)    UnHook flaHwndEnd Sub
    __________________________________________________________________________
      

  4.   

    Flash控件实际上是有句柄的,只是没直接提供属性。
    我以前回答过这个问题,在FAQ里有:
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=177996而且用自己的菜单替换掉了Flash的默认菜单。
      

  5.   

    goodname008的方法有点问题,在我的程序中我贴了你的代码,Flash的右键仍然能使用。
    sunxl(小呆)的方法不错,程序运行,一切OK。:) 非常谢谢各位,让我学到了新的知识。