首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visio互操作应用程序事件导致不想要的行为

Visio互操作应用程序事件导致不想要的行为
EN

Stack Overflow用户
提问于 2016-03-08 12:35:14
回答 2查看 660关注 0票数 0

我正在尝试使用Visio应用程序事件。当实例化一个新的应用程序对象并设置任何事件(即BeforeDocumentClose)时,这似乎会导致在最小化后无法恢复Visio窗口。

我使用VS/C# 2013,Windows窗体,Visio 2013 (在Windows 7上)。虽然我的主要代码项目是使用外接程序在各种office应用程序之间进行巨大的实现交换,但下面的简单代码重复了相同的问题。它是一个Windows项目(添加了对Microsoft.Office.Interop.Visio的引用)。

代码语言:javascript
复制
using Visio = Microsoft.Office.Interop.Visio;

Visio.Application app;
bool initialised = false;

private void visioButton_Click(object sender, EventArgs e)
{
    init();

    app.Documents.Add("c:\\test.vst"); // creates new document from template
}

void init()
{
    if (!initialised)
    {
        // only initialise once
        app = new Visio.Application();
        app.BeforeDocumentClose += app_BeforeDocumentClose;
        initialised = true;
    }
}

void app_BeforeDocumentClose(Visio.Document doc)
{
}

问题1:这是主要问题。创建一个或多个Visio文档后,Visio窗口在最小化后不会最大化。据我所知没有异常抛出。Windows就是这样做的--这是可听到的'ping‘错误。

问题2:这是第二个问题。创建两个或多个Visio文档,悬停在Windows任务栏上,预览窗口显示等待光标,而不是普通文档预览。

条件:问题#1仅在应用程序上使用事件时发生。文档、页面/形状事件不会造成任何问题。所有事件都很好地捕捉到。问题2总是发生,但这对我来说不太重要。

我已经搜索这个问题有一段时间了,但找不到任何相关的问题,所以任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-10 00:23:16

我不太清楚是什么原因导致Visio不响应还原,但是您可以尝试使用"AddAdvise“来代替:

代码语言:javascript
复制
[ComVisible(true)]
public partial class Form1 : Form, Visio.IVisEventProc
{
    public Form1()
    {
        InitializeComponent();
    }

    Visio.Application app;
    bool initialised = false;

    private void button1_Click(object sender, EventArgs e)
    {
        init();

        app.Documents.Add("C:\\test.vst"); // creates new document from template
    }

    void init()
    {
        if (!initialised)
        {
            // only initialise once
            app = new Visio.Application();
            // app.BeforeDocumentClose += app_BeforeDocumentClose;
            app.EventList.AddAdvise(DocCloseEventCode, this, null, null);
            initialised = true;

            Application.DoEvents();
        }
    }

    const short DocCloseEventCode = unchecked((short)Visio.VisEventCodes.visEvtDoc + (short)Visio.VisEventCodes.visEvtDel);

    object Visio.IVisEventProc.VisEventProc(short eventCode, object source, int eventID, int eventSeqNum, object subject,object moreInfo)
    {
        if (eventCode == DocCloseEventCode)
            app_BeforeDocumentClose(subject as Visio.Document);

        return null;
    }

    void app_BeforeDocumentClose(Visio.Document doc)
    {
    }
}
票数 0
EN

Stack Overflow用户

发布于 2016-03-21 12:07:38

为了使用Nikolay的建议为多个事件提供完整的解决方案,下面是完整的代码,包括Visio应用程序的事件和(De)初始化,并且不使用模板。(请注意,消息框可能会出现在Visio窗口后面的背景中。)

代码语言:javascript
复制
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Visio = Microsoft.Office.Interop.Visio;

namespace VisioInteropTest
{
    [ComVisible(true)]
    public partial class TestForm : Form, Visio.IVisEventProc
    {
        Visio.Application app;
        bool initialised = false;

        // all AddAdvise events:
        // https://msdn.microsoft.com/en-us/library/office/ff768620.aspx
        const short appCloseEventCode = (short)(Visio.VisEventCodes.visEvtApp | Visio.VisEventCodes.visEvtBeforeQuit);
        const short docCloseEventCode = (short)(Visio.VisEventCodes.visEvtDoc | Visio.VisEventCodes.visEvtDel);

        public TestForm()
        {
            InitializeComponent();
        }

        private void visioButton_Click(object sender, EventArgs e)
        {
            if (init())
            {
                app.Documents.Add("");
            }
        }

        bool init()
        {
            if (!initialised)
            {
                app = new Visio.Application();
                app.EventList.AddAdvise(appCloseEventCode, this, null, null);
                app.EventList.AddAdvise(docCloseEventCode, this, null, null);
                initialised = true;
            }
            return initialised;
        }

        object Visio.IVisEventProc.VisEventProc(short eventCode, object source, int eventID, int eventSeqNum, object subject, object moreInfo)
        {
            switch (eventCode)
            {
                case appCloseEventCode: app_BeforeAppClose((Visio.Application)subject); break;
                case docCloseEventCode: app_BeforeDocumentClose((Visio.Document)subject); break;
            }
            return null;
        }

        void app_BeforeAppClose(Visio.Application app)
        {
            initialised = false;
            MessageBox.Show("App closed");
        }

        void app_BeforeDocumentClose(Visio.Document doc)
        {
            MessageBox.Show("Doc closed");
        }

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35867551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档