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 __________________________________________________________________________
1 将Flash控件放入picturebox中,屏蔽picturebox的右键(这个很简单,你应该会吧)2 从flash控件提供的事件入手(好象成功率不高)3 用exescope等资源修改工具删除对应ocx文件的右键菜单(比较暴力)其它的请楼下补充
1 将Flash控件放入picturebox中,屏蔽picturebox的右键(这个很简单,你应该会吧)2 从flash控件提供的事件入手(好象成功率不高)3 用exescope等资源修改工具删除对应ocx文件的右键菜单(比较暴力)其它的请楼下补充
模块文件
___________________________________________________________________________
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
__________________________________________________________________________
我以前回答过这个问题,在FAQ里有:
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=177996而且用自己的菜单替换掉了Flash的默认菜单。
sunxl(小呆)的方法不错,程序运行,一切OK。:) 非常谢谢各位,让我学到了新的知识。