16,554
社区成员
发帖
与我相关
我的任务
分享
Imports System.Runtime.InteropServices
Public Class Form1 : Implements IMessageFilter
<DllImport("user32.dll")>
Private Shared Function WindowFromPoint(ByVal xPoint As Integer, ByVal yPoint As Integer) As IntPtr
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto)>
Private Shared Sub GetClassName(ByVal hWnd As System.IntPtr, ByVal lpClassName As System.Text.StringBuilder, Optional ByVal nMaxCount As Integer = 256)
End Sub
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=False)>
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As IntPtr, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
End Function
Public Const WM_LBUTTONDOWN As Integer = &H201
Public Const WM_LBUTTONUP As Integer = &H202
Public Const WM_RBUTTONDOWN As Integer = &H204
Public Const WM_RBUTTONUP As Integer = &H205
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Application.AddMessageFilter(Me)
WebBrowser1.Navigate("http://tnt.qq.com")
End Sub
Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
If m.Msg = WM_LBUTTONDOWN OrElse m.Msg = WM_LBUTTONUP Then
If GetFlashAxHandleByPoint(MousePosition) <> IntPtr.Zero Then
If m.Msg = WM_LBUTTONDOWN Then
SendMessage(m.HWnd, WM_RBUTTONDOWN, m.WParam, m.LParam)
End If
If m.Msg = WM_LBUTTONUP Then
SendMessage(m.HWnd, WM_RBUTTONUP, m.WParam, m.LParam)
End If
Return True
End If
End If
Return False
End Function
Private Function GetFlashAxHandleByPoint(ByVal p As Point) As IntPtr
Dim hwnd As IntPtr = WindowFromPoint(p.X, p.Y)
Dim ClassName As New System.Text.StringBuilder("", 256)
GetClassName(hwnd, ClassName)
If ClassName.ToString = "MacromediaFlashPlayerActiveX" Then Return hwnd Else Return IntPtr.Zero
End Function
End Class
这段代码给窗体实现了消息筛选器接口,在接口中过滤出点击Flash控件的左键按下和抬起消息并替换为相同坐标的右键按下和抬起消息,而后过滤掉该消息。