3

次のコードを使用して、表示されている Word アプリケーション ウィンドウからマネージ コントロールを取得しようとしています。

Process[] processes = null;
processes = Process.GetProcessesByName("WINWORD");
Process wordProc = processes[0];
Control wordControl = Control.FromHandle(wordProc.MainWindowHandle);

残念ながら、wordControl は常に null です...私の知る限り、ハンドル関連のコントロールが見つからない場合、FromHandle は null を返します。しかし、実際には、画面にウィンドウが表示されるため、関連するコントロールがあるはずです。

したがって、私の質問は、ハンドルまたはコントロールを取得しようとしているときに何かひどく間違ったことをしている場合です。または、.NET / Windows 環境のどこかに基づいた、現時点では不明な理由で、私の一般的なアプローチが機能しない可能性があります。

4

2 に答える 2

2

あなたがやろうとしていることは不可能です。独自のプロセスで実行されている Word のインスタンスを取得して、それを C# WinForms コントロールとしてキャストすることはできません。これは完全に安全ではありません。

やりたいことに応じて、次の 2 つの方法があります。

  • 既存の Word インスタンスの動作に影響を与えたい場合は、SendMessage() およびその他のさまざまな User32.DLL 関数を使用してメッセージを送信できます。これを行うには、 Pinvoke / DLL インポートを使用します。

  • 作成したアプリで Word の機能を使用しようとしている場合 (Word 文書の作成など)、Word 相互運用ライブラリを使用します。

編集

既存の Word インスタンスでキー イベントを処理することに関心がある場合は、関心のあるワード プロシージャのハンドルを指定して、低レベル キーボード フックを使用してキー イベントを処理できます。

于 2012-05-09T14:30:24.703 に答える
1

Control.FromHandle では、win32 ウィンドウの MainWindowHandle ではなく、マネージ コントロールのハンドルを渡す必要があります...

于 2012-05-09T14:30:15.700 に答える