【发布时间】:2016-08-12 20:34:38
【问题描述】:
我们使用GMA MouseHook 来制作精美的 Outlook VSTO 插件。 由于我们的 AddIn 的复杂性,我们在某些问题上有点陷入困境。
我们的问题: 我们将 Outlook 最大化,Mail.Compose 窗口也在其上最大化。如果我们单击 Mail.Compose 窗口上的关闭按钮,我们在 MouseDown-Event 中调用实际的窗口关闭。 现在 Mail.Compose 窗口关闭,并且 MouseUp + MouseClick 事件在底层 Outlook 主窗口的关闭按钮上触发。
我尝试设置 MouseEventArgs 的 e.Handled = True,但之后它仍然执行 MouseUp + MouseClick 事件。
关于如何解决这个问题的任何想法?
编辑感谢 mehrdad safa 为我指明了正确的方向! 以下是我解决问题的方法:
首先,我创建(例如从网络复制和粘贴)这个类:
Imports System.Runtime.InteropServices
Public Class MouseInterceptor
Public Delegate Function CallBack( _
ByVal nCode As Integer, _
ByVal wParam As IntPtr, _
ByVal lParam As IntPtr) As Integer
'Declare the mouse hook constant.
'For other hook types, obtain these values from Winuser.h in Microsoft SDK.
Dim WH_MOUSE As Integer = 7
Shared hHook As Integer = 0
'Keep the reference so that the delegate is not garbage collected.
Private hookproc As CallBack
'Import for the SetWindowsHookEx function.
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function SetWindowsHookEx _
(ByVal idHook As Integer, ByVal HookProc As CallBack, _
ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
End Function
'Import for the CallNextHookEx function.
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function CallNextHookEx _
(ByVal idHook As Integer, ByVal nCode As Integer, _
ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
End Function
'Import for the UnhookWindowsHookEx function.
<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function UnhookWindowsHookEx _
(ByVal idHook As Integer) As Boolean
End Function
'Point structure declaration.
<StructLayout(LayoutKind.Sequential)> Public Structure Point
Public x As Integer
Public y As Integer
End Structure
'MouseHookStruct structure declaration.
<StructLayout(LayoutKind.Sequential)> Public Structure MouseHookStruct
Public pt As Point
Public hwnd As Integer
Public wHitTestCode As Integer
Public dwExtraInfo As Integer
End Structure
Public Shared Function MouseHookProc( _
ByVal nCode As Integer, _
ByVal wParam As IntPtr, _
ByVal lParam As IntPtr) As Integer
Dim MyMouseHookStruct As New MouseHookStruct()
If (nCode < 0) Then
Return CallNextHookEx(hHook, nCode, wParam, lParam)
End If
MyMouseHookStruct = CType(Marshal.PtrToStructure(lParam, MyMouseHookStruct.GetType()), MouseHookStruct)
Return CallNextHookEx(hHook, nCode, wParam, lParam)
End Function
然后我只是在关闭窗口之前在我的 MouseDown 事件中调用它:
MouseInterceptor.MouseHookProc(0, "0x201", 0)
第一个参数告诉 Hook 如果值
【问题讨论】:
标签: vb.net outlook-addin