2

シングルクリックで複数のドキュメントを開き、個々のドキュメントウィンドウのサイズと場所を指定するプログラムを作成しようとしています。2番目のWordまたはExcelドキュメントを開こうとするまで、開封と測位の操作をテストする基本的なプログラムでかなりの成功を収めていました。

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("user32.dll", SetLastError = true)]
        internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        static void Main(string[] args)
        {
            Process resize = new Process();

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\TEST1.txt";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 10, 10, 500, 500, true);

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSWTEST1.docx";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 20, 20, 500, 500, true);

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSXTEST1.xlsx";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 30, 30, 500, 500, true);

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\TEST2.txt";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 40, 40, 500, 500, true);

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSWTEST2.docx";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 50, 50, 500, 500, true);

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSXTEST2.xlsx";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 60, 60, 500, 500, true);
         }
    }
}

プログラムは、メモ帳を使用して2つの.txtファイル、MSWordを使用して2つの.docxファイル、およびMSExcelを使用して2つの.xlsxファイルを開こうとします。プログラムでドキュメントを開いた順序に関係なく、2番目のWordまたはExcelファイルを開いた直後にWaitForInputIdle行にInvalidOperationExceptionがスローされます。このエラーを修正するための助けをいただければ幸いです。

4

3 に答える 3

5

WordまたはExcelドキュメントを開こうとすると、実行中のアプリケーション(バージョンによって異なります)は、すでに実行されている同じアプリケーションを探し、新しい「ウィンドウ」を開くように要求してシャットダウンします。これは、実際に実行しているアプリケーションが実際にメッセージポンプを取得することは決してないことを意味します。これによりWaitForInputIdleInvalidOperationException文書化されているように)

例外をキャッチして無視することをお勧めします-Word/Excelが更新を介してドキュメントを正常に開いたかどうかを判断する方法がわかりませんProcess.Start :概念的には、例外が発生した場合、Word/Excelが別の実行中を検出したことを意味しますインスタンスに切り替えたので、おそらくそれはある程度の「成功」です。

于 2013-02-13T17:34:44.783 に答える
3

2番目のWordまたはExcelドキュメントを開くと、起動プロセスはWord / Excelが既に開始されていることを検出し、他のプロセスにドキュメント情報を送信してシャットダウンします。

メモ帳などの単純なアプリケーションには、そのような動作はありません。

つまり、その場合、Process2回目に起動するインスタンスは、開かれているドキュメントを制御するために正確にジルチする価値があります。

于 2013-02-13T17:34:07.237 に答える
0

複数のProcessオブジェクトを使用したり、このようなMSOfficeINTERropアセンブリを試したりするのはどうですか

http://www.c-sharpcorner.com/UploadFile/mgold/CreatingandOpeningMicrosoftDocumentfrom.NETUsingCSharp11262005050939AM/CreatingandOpeningMicrosoftDocumentfrom.NETUsingCSharp.aspx

于 2013-02-13T17:30:36.077 に答える