6

Microsoft Wordが最初に読み込まれるときに、NewDocumentイベントもDocumentOpenイベントも発生しません。Wordのインスタンスがすでに開いていて、新しいドキュメントまたは既存のドキュメントが開かれている場合、これらのイベントは正常に発生します。

私が見た提案は、他の2つのイベントの代わりに、DocumentChangeイベント(Wordのロード時に常に発生する)を処理することです。

私の質問は、これについてどうやって行くのかということです。DocumentChangeイベントにはパラメーターがないので、ドキュメント(新規または既存)がいつ開かれたかをどのように知ることができますか?

さらに、DocumentChangeイベントにはすでにロジックがあり、新規ドキュメントと既存ドキュメントの処理が異なるため、すべてのコードをイベントにスローすることはできません。

private void ThisAddIn_Startup(object sender, System.EventArgs a)
{
  this.Application.DocumentChange += new ApplicationEvents4_DocumentChangeEventHandler(Application_DocumentChange);
}

private void Application_DocumentChange()
{
  // How do I handle NewDocument or DocumentOpen?
}
4

3 に答える 3

2

このリンクはあなたを助けます、基本的に彼らが言うことは、ThisAddIn_StartupはDocumentOpenイベントが実行を終えた後に実行されるということです。ハイパーリンクをたどるだけで問題の回避策もあります。

于 2012-10-02T08:04:24.027 に答える
2

そのため、ロードされたドキュメントをThisAddIn_Startupで処理することになりました。ドキュメントのパスが空の文字列である場合、ドキュメントは新しく、ローカルマシンに保存されたことがないことがわかります。それ以外の場合は、保存されていることを知っており(tempディレクトリを含む)、既存のドキュメントとして処理します。

private void ThisAddIn_Startup(object sender, System.EventArgs a)
{
  try
  {
    Word.Document doc = this.Application.ActiveDocument;
    if (String.IsNullOrWhiteSpace(doc.Path))
    {
      ProcessNewDocument(doc);
    }
    else
    {
      ProcessDocumentOpen(doc);
    }
  }
  catch (COMException e)
  {
    log.Debug("No document loaded with word.");
  }

  // These can be set anywhere in the method, because they are not fired for documents loaded when Word is initialized.
  ((MSWord.ApplicationEvents4_Event)this.Application).NewDocument +=
    new MSWord.ApplicationEvents4_NewDocumentEventHandler(Application_NewDocument);
  this.Application.DocumentOpen +=
    new MSWord.ApplicationEvents4_DocumentOpenEventHandler(Application_DocumentOpen);
}

Deniの回答に対する私のコメントは次のように述べています。ThisAddIn.Desiger.csのInitialize()メソッドでDocumentOpenイベントハンドラーを設定すると、既存のドキュメントに対して機能しましたが、Wordを開いたときに初期化された新しいドキュメントに対してNewDocumentが呼び出されないため、このソリューションは機能しませんでした。そのため、ThisAddIn_StartupイベントでDocumentOpenとNewDocumentの設定を残しました。そうしないと、ドキュメントがWordで読み込まれたときにDocumentOpenが起動されます。

于 2012-10-02T19:16:15.440 に答える
1

スタートアップハンドラーのApplication.Documentsコレクションを使用して、アドインが読み込まれる前に存在するすべてのドキュメントを検索しました。それはあなたの答えがするのと同じことを達成します、そしてさらに、何らかの理由で(Wordが起動するときではなく)後でオンデマンドでアドインをロードする場合、コレクションを列挙することはアクティブなドキュメント以上のものを得ることができます。

DocumentChange()イベントは、ActiveDocumentが変更されるたびに発生します。Wordには、一度に1つのアクティブなドキュメントしかありません。複数の開いているWord文書を切り替えると、イベントが発生します。また、ドキュメントを閉じるときに、別の開いているドキュメントがアクティブになると、イベントが発生する可能性があります。また、最後のドキュメントが閉じた後に起動します。この場合、Application.ActiveDocumentは無効になります。

于 2015-02-04T18:12:05.367 に答える