2011-08-10 20 views
4

C++で書かれた古いWindows 32ビットアプリケーションがあり、テキストボックスに似た結果が表示されます。C#WindowsフォームアプリケーションのWindows APIを使用してC#アプリケーション以外のテキストボックスを読む

私は、古いアプリからデータを読み込んでさらに処理するC#でアプリケーションを書くよう依頼されています。

問題は古いアプリケーションのテキストボックスをどのように読み取るかです。

誰かがWindows APIを使用してアプリケーションの「ハンドル」を取得し、コントロールをステップして各データを読み取ることができると教えてくれました。これは本当ですか、もしそうなら、私はC#からどうやってやるのでしょうか?

これは、.Net 4 Windowsフォームアプリケーションです。あなたはおそらく、いくつかの相互運用機能を使用する必要があるとしている

感謝

答えて

4

は、具体的FindWindow/FindWindowExSendMessage & WM_GETTEXT/WM_GETTEXTLENGTHの組み合わせを使用して、これを達成するために呼び出します。ここで

は、それは日付ビットだ(ただし、同じ概念がちょうどP/Invokeを使用するように移植する必要があります、Cの++で)対象にarticleですが、私はあなたの状況に非常に関連性がなければならないと考えています。

+0

ありがとうございます。 – Adrian

+0

メインウィンドウが別のフォームを開き、ハンドル!この状況では、親ハンドルまたは子ハンドルを取得するにはどうすればよいですか? – Adrian

1

Spy ++アプリケーション(VisualStudioに付属)を使用してネイティブアプリケーションを検査し、探しているコントロールのクラス名を見つけることができます。

 
... 
var proc = Process.Start(); 
var mainWndHandle = proc.MainWindowHandle; 

そうでない場合は、あなたが他の手段を見つける必要があります:あなたはあなたのC#のアプリからそのアプリケーションを起動するための責任がある場合は簡単です、あなたのネイティブアプリケーションのメインウィンドウハンドルを取得することができ、ことを持つ

その窓を見つける、fe。あなたはデスクトップでそのウィンドウを探すために私が下で説明した関数を使うことができます(詳細についてはmsdnページを参照してください)

もしあなたがすべて持っていれば、FindWindowEx関数を使用して、同様に、メインウィンドウを見つけるために、hwndParentとしてNULLを渡すことでそれを使うことができます)。

このテキストボックスを処理すると、内容をsending message,WM_GETTEXTで読むことができます。

PInvoke'ingされていない場合は、http://pinvoke.net/を参照して、C#プログラムからWINAPI関数を呼び出す方法を参照してください。

+0

これはまた私を助ける多くのありがとう。 – Adrian

0

本当にC++アプリケーションのUIが必要ですか?異なるメッセージポンプを持つ2つの別々のUIを持つことは非常に不愉快なので、この混乱を値の更新に同期させる必要があります。

C++アプリケーションのロジックコードを適切に削除し、Interop CLRプロジェクト(C++/CLI)で公開しないのはなぜですか? C++アプリケーションに他の機能を追加する必要がない場合は、私にとっては非常にわかりやすいようです。

+0

残念なことに、内部政治のために、私は元の情報源にアクセスできない!あなたの返信に感謝します – Adrian

関連する問題