如何禁用双击和右键单击的默认PowerPoint事件功能?

时间:2014-05-06 05:33:08

标签: c# events mouseevent vsto powerpoint

在使用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的CancelWindowBeforeDoubleClick事件提供。如果设置为WindowBeforeRightClick,则会取消PowerPoint在触发事件时执行的默认操作。如何在我的true活动中访问此媒体资源?

1 个答案:

答案 0 :(得分:1)

MouseKeyboardActivityMonitor提出了几个可用的事件。对于鼠标按下事件,您可以选择收听MouseDownMouseDownExt。后者为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事件类似。