2012-10-01 9 views
5

Microsoft Wordが最初に読み込まれたときにNewDocumentもDocumentOpenイベントも起動されません。 Wordのインスタンスが既に開いていて、新規または既存のドキュメントが開かれた場合、これらのイベントは正常に終了します。NewDocumentイベントが読み込み時に発生しないため、Word DocumentChangeイベントを処理する方法

私が見てきた提案は、他の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? 
} 

答えて

2

私はThisAddIn_Startupでロードされたドキュメントの処理を終了しました。ドキュメントのパスが空の文字列の場合、ドキュメントは新規でローカルマシンに保存されていないことがわかります。そうでなければ、私はそれが保存されていることを知っています(一時ディレクトリーを含む)、私はそれを既存の文書として処理します。

デニの回答状況についての私のコメントとして
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); 
} 

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

2

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

+0

これは完全に_DocumentOpenで動作しますが、_NewDocumentでは機能しません。 _NewDocumentは、ユーザーが[ファイル] - > [新規]を実行したときにのみ起動され、Wordが新しいドキュメントで開くときには起動されないことを覚えています。これが本当であれば、単語が開くときに新しい文書を扱う方法に関するアイデアはありますか? _WindowActivateは、Wordが最初に開いたときだけでなく、Wordがフォーカスを取得するたびに起動します。だから私は_WindowActivateを処理しようとすることができますが、それは乱雑になるかもしれないように感じる。思考? –

1

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

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

関連する問題