在使用VSTO的PowerPoint加载项中,我正在实施Application-level Mouse Hook
来捕获鼠标事件,例如双击,右键单击,鼠标悬停等,使用从Codeplex下载的MouseKeyboardActivityMonitor.dll
。我这样做的原因是因为PowerPoint没有要监听的鼠标相关事件,并且它所提供的事件不会在PowerPoint的编辑模式中被触发。
在我的加载项中,当用户单击图表时,会出现一个菜单,允许用户在图表上执行各种功能。一切都很好。我已捕获鼠标事件并显示自定义菜单,但在执行某些操作后关闭菜单时出现问题,屏幕上会出现PowerPoint的默认菜单。
示例:当用户双击图表时,我会显示这样的表单菜单。
//Listening to the MouseDoubleClick event
MyMouseHookListener.MouseDoubleClick += MyMouseHookListener_MouseDoubleClick;
//MouseDoubleClickEvent
void MyMouseHookListener_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
FormMenu.ShowDialog(); //Displaying menu
}
这很好用,但当用户关闭表单时,会出现PowerPoint图表的默认双击菜单。同样是其他鼠标事件的问题。
如何禁用PowerPoint的事件菜单?
更新
有一个名为bool
的{{1}}属性,由PowerPoint的Cancel
和WindowBeforeDoubleClick
事件提供。如果设置为WindowBeforeRightClick
,则会取消PowerPoint在触发事件时执行的默认操作。如何在我的true
活动中访问此媒体资源?
答案 0 :(得分:1)
MouseKeyboardActivityMonitor
提出了几个可用的事件。对于鼠标按下事件,您可以选择收听MouseDown
或MouseDownExt
。后者为MouseEventExtArgs
参数提供了一些额外选项,例如Handled
属性。如果将此参数设置为true,则事件不会进一步传播。
对于MouseDoubleClick
事件,没有可用的扩展事件。因此,我建议您使用MouseDownExt
侦听器并计算已发生的点击次数来自己实现双击侦听器。
public void Initialize() {
// Initialize your listener and set up event listeners
MyMouseHookListener = new MouseHookListener(new AppHooker()) {Enabled = true};
MyMouseHookListener.MouseDownExt += MyMouseHookListenerOnMouseDownExt;
// UNDONE Delete when testing is done; included to show that the listener is never called
MyMouseHookListener.MouseDoubleClick += MyMouseHookListenerOnMouseDoubleClick;
}
private static void MyMouseHookListenerOnMouseDoubleClick(object sender, MouseEventArgs mouseEventArgs)
{
// NOTE: This listener should never be called
Debug.Print("Mouse double-click!");
}
private static void MyMouseHookListenerOnMouseDownExt(object sender, MouseEventExtArgs mouseEventExtArgs)
{
Debug.Print("Mouse down. Number of clicks: {0}", mouseEventExtArgs.Clicks);
if (mouseEventExtArgs.Clicks == 2)
{
// TODO Insert your double-click code here
mouseEventExtArgs.Handled = true;
}
}
为了详尽无遗,您或许也应该测试它是否是单击的左按钮或右按钮,您可以通过检查MouseEventExtArgs.Button
属性来测试它。右键双击现在将被视为双击,但据我所知,这与原始MouseDoubleClick
事件类似。