利用Application.AddMessageFilter屏蔽消息

很早时候就注意到ApplicationAddMessageFilter,苦于自己基础差,测试不出好结果来。今天看贴,有人想屏蔽Form上凡TextBox的右键消息,于是重新看了看这个话题。只是还是没有得出什么好效果来,只能将就着实现。

 

Application.AddMessageFilter主要的功能是添加消息筛选器以便在向目标传送 Windows 消息时监视这些消息。

 

(哎,本来想按自己的理解说这些含义的,怕误人了,受骂也多了,汲取教训,还是照贴MSDN的原字吧。可怜的我,本来就不是专业人士,也只能是入俗,僧不僧俗不俗的,乡巴佬戴领带入城,可怜哪。)

 

注意:向应用程序的消息泵添加消息筛选器会降低性能。(警告之类的我是一般不管的,有用就用,管它)

 

使用Application.AddMessageFilter与一般的方法调用不一样,它的参数Message有这样的要求:若要防止调度某消息,传递给该方法的 value 参数实例必须用处理该消息的代码重写 PreFilterMessage 方法。该方法必须返回 false

 

以屏蔽Form上凡TextBox的右键消息为例,下面交待一下主要做法。

 

一、实现ImessageFilter接口。如下。

为什么做了个传递Form的属性,只要是用来判断当前控件是不是TextBox用的。这种效果并不理想,需要改进。本来是不需要引进这个属性的,用Message.GetLParam方法就可以得知当前消息的对象是不是TextBox,可怜我不知道那个Structure该如何写,若是你给我贴出来补正,小人感激不尽。

 

Public Class TextBoxRButtonMessageFilter

    Implements System.Windows.Forms.IMessageFilter

    Const WM_RBUTTONDOWN As Integer = &H204

    Const WM_RBUTTONUP As Integer = &H205

    Private m_Form As System.Windows.Forms.Form

    Public WriteOnly Property [Form]() As System.Windows.Forms.Form

        Set(ByVal Value As System.Windows.Forms.Form)

            m_Form = Value

        End Set

    End Property

 

    Public Function RButtonFilterMessage(ByRef m As System.Windows.Forms.Message)

    As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage

        If (m.Msg = WM_RBUTTONDOWN OrElse m.Msg = WM_RBUTTONUP) AndAlso m_Form.ActiveControl.GetType.Name.Equals("TextBox") Then

         Return True

        Else

            Return False

        End If

    End Function

End Class

 

二、向应用程序的消息泵添加消息筛选器。

 

#Region " Windows 窗体设计器生成的代码 "

Public Sub New()

    MyBase.New()

   '该调用是 Windows 窗体设计器所必需的。

    InitializeComponent()

    ' InitializeComponent() 调用之后添加任何初始化

    mMsgFilter.Form = Me

    System.Windows.Forms.Application.AddMessageFilter(mMsgFilter)

End Sub

……

#End Region

Private mMsgFilter As New TextBoxRButtonMessageFilter

 

就这么简单。问题是怎么使用Message.GetLParam的,请指教。

 

三、以下用Handle来代替ActiveControl

 

#Region " Windows 窗体设计器生成的代码 "

Public Sub New()

    MyBase.New()

    '该调用是 Windows 窗体设计器所必需的。

    InitializeComponent()

    ' InitializeComponent() 调用之后添加任何初始化

    MsgFilterInit()

End Sub

.......

#End Region

Private mMsgFilter As New TextBoxRButtonMessageFilter

Private Sub MsgFilterInit()

    Dim ctr As System.Windows.Forms.Control

    For Each ctr In Me.Controls

        If TypeOf ctr Is TextBox Then

            mMsgFilter.SetFilterHandles(ctr.Handle)

        End If

    Next

    System.Windows.Forms.Application.AddMessageFilter(mMsgFilter)

End Sub

End Class

 

 

 

Public Class TextBoxRButtonMessageFilter

    Implements System.Windows.Forms.IMessageFilter

    Const WM_RBUTTONDOWN As Integer = &H204

    Const WM_RBUTTONUP As Integer = &H205

    Private m_HWnds As New Hashtable

    Public Sub SetFilterHandles(ByVal mHWnd As IntPtr)

        m_HWnds.Add(mHWnd, Nothing)

    End Sub

    Public Function RButtonFilterMessage(ByRef m As System.Windows.Forms.Message) _

    As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage

        If (m.Msg = WM_RBUTTONDOWN OrElse m.Msg = WM_RBUTTONUP) AndAlso m_HWnds.Contains(m.HWnd) Then

            Return True

        Else

            Return False

        End If

    End Function

End Class

在 Chrome 浏览器的背景脚本(background script)中,`chrome.runtime.sendMessage` 和 `chrome.runtime.sendNativeMessage` 都用于在不同的脚本之间传递消息,其中 `sendNativeMessage` 用于跨进程通信,比如从浏览器到扩展程序,再到 C++ 插件。 当你想在 C++ 插件端接收来自 JavaScript 的 native 消息时,你需要创建一个注册的回调函数,并使用 `content::BrowserContext::AddMessageFilter` 来监听特定的消息类型。以下是一个简单的示例: 首先,在 C++ 中设置消息过滤器: ```cpp #include "content/public/browser/browser_context.h" #include "content/public/browser/message_filter.h" // 注册一个处理 native 消息的函数 void RegisterMessageHandler(content::BrowserContext* browser_context) { content::RenderProcessHost::GetGlobal()->AddFilter( base::BindRepeating(&YourPluginClass::OnNativeMessageReceived, base::Unretained(this), browser_context)); } // C++ 类中的接收函数 bool YourPluginClass::OnNativeMessageReceived(content::BrowserContext* context, const std::string& request_data) { // 解析并处理请求数据 // ... return true; // 如果成功处理则返回true,否则可以返回false } ``` 然后,在 JavaScript 端发送 native 消息: ```javascript chrome.runtime.onMessageExternal.addListener(function(request, sender, sendResponse) { if (request.some_condition) { // 根据条件判断是否发送 native 消息 chrome.runtime.sendNativeMessage('your_extension_id', 'your_message'); } }); ``` 这里,`'your_extension_id'` 应替换为你的实际扩展 ID,`'your_message'` 是你想传输的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值