2012-05-09 8 views
3

ハンドルのIntPtrからコントロール/ Formオブジェクトを取得します。私は、次のコードを使用して表示Wordのアプリケーションウィンドウから管理コントロールを取得しようと

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

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

私の質問は、ハンドルやコントロールを取得しようとしている間に何かひどく間違っている場合です。 または、おそらく私の一般的なアプローチは、現時点では未知の、.NET/Windows環境のどこかに基づく理由のためには機能しません。

+0

実際にはあなたの情報のために: MainWindorHandleは適切なハンドルを返します。 – inva

答えて

1

あなたを必要とすることはできません。独自のプロセスで実行されているWordのインスタンスを取得してC#WinForms Controlとしてキャストすることはできません。これは完全に安全ではありません。

あなたが何をしたいのかに応じて、あなたが取ることができる2つの方法があります:あなたは、既存のWordインスタンスの動作に影響する場合

  • は、その後、あなたはSendMessage関数を使用して、それにいくつかのメッセージを送信することができます( )とその他のUser32.DLL関数があります。これを行うにはPinvoke/DLL Importを使用してください。

  • あなたが書かれているアプリでWordの機能を使用しようとしている場合(例えばワード文書を作成する)、その後Word interop librariesを使用します。

編集

あなたは取り扱いに興味があれば既存のWordインスタンスでキーイベントを使用する場合は、Low Level keyboard hookを使用して、キーイベントを処理し、興味のある単語procsのハンドルを指定できます。

+0

リチャードに感謝します。私はこれが当てはまるとは思っていませんでしたが、私が実際にやろうとしているのは、開いているWord文書のkeypownイベント(winAPI)をキャプチャすることです。これを行うコードは、単語の追加です。あなたはこれを達成する方法をいくつか考えていますか? – inva

+0

Wordのキーダウンイベントを処理したいのですか? – Richard

+0

はい。私はすべてのキーを検討したい - 最初の試行で少なくとも。 – inva

1

Control.FromHandleは何をしようとする...管理制御、ないのWin32ウィンドウのMainWindowHandleのハンドルを渡すために

+0

この場合、マネージコントロールとはどういう意味ですか?私はWordのアプリケーションフォームが管理されたコントロールかもしれないと思った。しかし、実際には、実行中のプロセスのハンドルしかありません。管理されたコントロールがすべてではないと思います。 – inva

関連する問題