6

これを行うことで、Office 相互運用機能を使用して Word の新しいインスタンスを作成しています。

var word = Microsoft.Office.Interop.Word.Application();
word.Visible = true;
word.Activate;

次のようなウィンドウ ハンドルを取得できます。

var wordHandle = Process.GetProcessesByName("winword")[0].MainWindowHandle;

問題は、Word の他のインスタンスが実行されていないという前提でコードが動作することです。複数ある場合、返されるハンドルが起動したインスタンスのものであるとは限りません。GetForegroundWindowオブジェクトからイベントを検出した後に使用しようとしましWindowActivateたが、これはすべて、最上位のウィンドウとして実行するように設定された WPF アプリケーション内で実行されているため、WPF ウィンドウへのハンドルを取得するだけです。Word のインスタンスのハンドルを取得する他の方法はありますか?

4

6 に答える 6

6

Word へのハンドルが必要な理由はわかりませんが、これまで行った 1 つの方法は、実際に Word ウィンドウのキャプションを変更して検索することです。コントロール内で Word アプリケーションをホストしたかったので、これを行いましたが、それは別の話です。:)

  var word = new Microsoft.Office.Interop.Word.Application(); 
  word.Visible = true; 
  word.Activate();
  word.Application.Caption = "My Word";

  foreach( Process p in Process.GetProcessesByName( "winword" ) )
  {
    if( p.MainWindowTitle == "My Word" )
    {
      Debug.WriteLine( p.Handle.ToString() );
    }
  }

ハンドルを取得したら、必要に応じてキャプションを復元できます。

于 2011-12-29T21:56:12.287 に答える
1

Word 2013以降、から公開されているのHwndプロパティを使用できますWindowApplication

var windowHandle = wordApplication.ActiveWindow.Hwnd;

Hwnd は、指定されたウィンドウのウィンドウ ハンドルを示す整数を返します。これにより、ウィンドウ ハンドルの低レベルのカプセル化を提供するintを使用できます。NativeWindow

var nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(new IntPtr(windowHandle));
于 2019-12-02T20:24:55.970 に答える
0

挿入されたマクロが WINWORD プロセス内で直接実行されるという事実を利用する別の方法:

using System;
using Word = NetOffice.WordApi;
using System.Diagnostics;

namespace WordHwnd
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var app = new Word.Application() { Visible = true })
            {
                var process = GetProcess(app);
                Console.WriteLine(process.MainWindowHandle);

                app.Quit();

            }

            Console.ReadLine();
        }

        private static Process GetProcess(Word.Application app)
        {
            var tempDocument = app.Documents.Add();
            var project = tempDocument.VBProject;
            var component = project.VBComponents.Add(NetOffice.VBIDEApi.Enums.vbext_ComponentType.vbext_ct_StdModule);
            var codeModule = component.CodeModule;
            codeModule.AddFromString("#If Win64 Then\r\n   Declare PtrSafe Function GetCurrentProcessId Lib \"kernel32\" () As Long\r\n#Else\r\n   Declare Function GetCurrentProcessId Lib \"kernel32\" () As Long\r\n#End If");

            var result = app.Run("GetCurrentProcessId");

            var process = Process.GetProcessById((int)result);

            tempDocument.Close(false);

            return process;
        }
    }

}
于 2017-01-04T11:24:33.423 に答える