【发布时间】:2014-08-19 20:01:07
【问题描述】:
我正在尝试拦截使用 WINAPI 函数“BroadcastSystemMessage”发送的 Windows 消息(来自创建新工作簿时发送此消息的 XLL)。
我尝试使用两种方法来做到这一点,但每种方法都有其缺点:
1) 使用托管监听窗口:
但是,我不想冒用户关闭此侦听窗口的风险,并且,
listenForm.Show()
listenForm.visible = false
看起来很草率。
2) 使用钩子:
但是,“SetWindowsHookEx”的回调只有几个参数:
Protected Function HookCallBack(code As Integer, wParam As IntPtr, lParam As IntPtr) As Integer
我正在寻找一种访问“msg”结构的方法,该结构包含我在“RegisterWindowMessage”中注册的信息。
这里,“lParam”指向这个结构,我可以使用:
Dim output(100) As Byte
Marshal.Copy(e.lParam, output, 0, 100)
取消引用这个指针。我不知道如何解析结果,而且我在离托管宇宙这么远的地方徘徊也让我很困扰。
我的问题:每种方式的缺点都可以解决吗?拦截消息或做类似事情的标准方法是什么?
【问题讨论】:
-
我不一定说它的好坏,但为此目的创建一个隐藏窗口是很常见的做法。您可以将窗口调整得非常小,也可以将其移动到屏幕边界之外,以确保用户无法关闭它。
-
知道了,那就继续吧,谢谢。