0

我正在使用 Visual Studio 2010 构建 PowerPoint 2010 C# 加载项。加载项的功能之一是将形状添加到当前幻灯片。但是,将形状添加到幻灯片后,我需要防止它被复制。那就是我遇到问题的地方。我查看了所有应用程序级别的事件,没有看到任何类型的 beforeCopy 或 beforePaste 类型的事件。

我现在能想到的唯一选择是添加一个 keydown 事件侦听器来侦听“ctrl+c”并在我的形状被选中时阻止它,然后创建一个自定义右键单击菜单(甚至不确定我是否可以)如果选择了我的形状,请删除“复制”选项。不过,必须有更简单的选择。

任何人都知道如何防止用户复制形状?

4

2 回答 2

2

可以禁用或重新路由 Microsoft Office 内置功能区按钮执行的命令。Microsoft 将此称为“再利用”,可以在此处找到介绍。

因此,另一种方法可能是使用类似这样的东西“重新调整”内置复制按钮的用途。(需要通过GetCustomUI返回来自定义功能区,见上面的链接。)这修改了复制按钮执行的动作和确定按钮是否启用的回调方法。

<command idMso="Copy" onAction="copyAction" getEnabled="copyEnabled" />

当你的形状被选中时实现copyAction返回cancelDefault = true,这样它就不会被复制。

如果您的形状被选中,实现copyEnabled返回。false请记住使选择更改事件的按钮无效。

实际上,两种方法中的一种就足够了。我想onAction更容易实现。

于 2012-08-24T14:07:33.837 回答
0

只是为了结束这个循环,我正在分享我的解决方法,希望有这个问题的其他人不会像我在这方面浪费那么多时间。我最终只使用SlideSelectionChangedWindowSelectionChange事件以及字典来删除已复制的对象。

首先,当我的形状被添加到舞台时,我在字典中添加了一个新条目,其中包含形状名称(在我的例子中,它实际上是一组形状)和它的 ID。

itemIDDictionary.Add(myGroup.Name, myGroup.Id);

WindowSelectionChange是一个相当简单的检查。它只是查看新选择的项目是否已经在字典中。如果是,则检查 ID 是否匹配。如果不是,它会删除该项目。这是因为当您复制和粘贴一个项目时,新粘贴的项目会自动在幻灯片上被选中。

public void itemSelectionChange(PowerPoint.Selection SelectedItem)
{
    try
    {
        if (Globals.Ribbons.Ribbon2.itemIDDictionary.ContainsKey(SelectedItem.ShapeRange.Name))
        {
            for (int shapeIDCount = 0; shapeIDCount < Globals.Ribbons.Ribbon2.itemIDDictionary.Count; shapeIDCount++)
            {
                if (!Globals.Ribbons.Ribbon2.itemIDDictionary.ContainsValue(SelectedItem.ShapeRange[1].Id))
                {
                    SelectedItem.Delete();
                    MessageBox.Show("You can not copy the browser object.\nAdd a new one using the ribbon bar");
                }
            }
        }
    }
catch {}

SlideSelectionChanged稍微复杂一点,因为我必须遍历幻灯片上的所有形状。

try
{
    if (SldRange.Count > 0)
    {
        var showWarning = false;
        for (int slideCount = 1; slideCount <= SldRange.Count; slideCount++)
        {
            int shapeCount = 1;
            while (shapeCount <= SldRange[slideCount].Shapes.Count)
            {
                if (Globals.Ribbons.Ribbon2.itemIDDictionary.ContainsKey(SldRange[slideCount].Shapes[shapeCount].Name))
                {
                    if (!Globals.Ribbons.Ribbon2.itemIDDictionary.ContainsValue(SldRange[slideCount].Shapes[shapeCount].Id))
                    {
                        SldRange[slideCount].Shapes[shapeCount].Delete();
                        showWarning = true;
                    }
                    else
                    {
                        shapeCount++;
                    }
                }
                else
                {
                    shapeCount++;
                }
            }
        }
        if(showWarning == true)
        {
            MessageBox.Show("You can not copy the browser object.\nAdd a new one using the ribbon bar");
        }
    }
}
catch { }

正如我在最初的帖子中所说,我确信有一种更清洁的方法可以做到这一点。我只是找不到一个来救我的命。

于 2012-08-23T09:33:19.717 回答