別のプログラムでクエリを実行するために、Windows アプリケーションからデータをスクレイピングする必要があります。.NETでこれを行うための良い出発点を知っている人はいますか?
28317 次
1 に答える
16
WM_GETTEXT メッセージを調べることができます。これは、他のウィンドウからテキストを読み取るために使用できます。これは、Windows API の古風な部分であり、C# を使用している場合は、p/invoke が必要になります。
C# でこれを行う例については、このページを確認してください。
基本的に、最初に FindControlEx() を使用して、必要なウィンドウのハンドルを (キャプションで) 取得します。
次に、EnumChildWindows() を使用してそのウィンドウのコントロールを再帰的に列挙し、ターゲット フォームの完全なマップが得られるまで、ウィンドウのすべての子コントロールとそれらの子のすべての子を検索します。
以下は、Google Answers からの Theta-ga の優れた説明の抜粋です。
テキストボックスまたはリストボックス コントロールの内容を取得するために必要なのは、そのウィンドウ ハンドルだけです。既にウィンドウ ハンドルを取得している場合は、説明のパート 2 に進みます。
パート 1: コントロール ハンドルの取得
- コントロールのハンドルを取得するには、まずその親ウィンドウのハンドルを取得します。Win32 FindControlEx() メソッドを使用してこれを行うことができます。このメソッドは、ウィンドウ キャプション (「Calculator」など) および/またはそのクラス名を受け取り、そのハンドルを返します。
- 親ウィンドウ ハンドルを取得したら、Win32 EnumChildWindows メソッドを呼び出すことができます。このメソッドはコールバック メソッドを受け取り、指定された親に対して見つけたすべての子コントロールのハンドルを使用して呼び出します。たとえば、電卓ウィンドウのハンドルを使用してこのメソッドを呼び出すと、テキスト ボックス コントロールのハンドルを使用してコールバック メソッドが呼び出され、次に電卓ウィンドウの各ボタンのハンドルを使用してコールバック メソッドが呼び出されます。 .
- テキスト ボックス コントロールのハンドルのみに関心があるため、コールバック メソッドでウィンドウのクラスを確認できます。これには、Win32 メソッド GetClassName() を使用できます。このメソッドは、ウィンドウ ハンドルを受け取り、クラス名を含む文字列を提供します。したがって、テキストボックスは ?Edit? に属します。クラス、「ListBox」クラスへのリストボックスなど。適切なコントロールのハンドルがあると判断したら、その内容を読み取ることができます。
パート 2: コントロールの内容の読み取り
- Win32 SendMessage() 関数を使用してコントロールの内容を読み取ることができ、それを使用して WM_GETTEXT メッセージをターゲット コントロールに渡します。これにより、コントロールのテキスト コンテンツが得られます。このメソッドは、テキスト ボックス、ボタン、または静的コントロールに対して機能します。
- ただし、リストボックスの内容を読み取ろうとすると、上記の方法は失敗します。リストボックスの内容を取得するには、最初に LB_GETCOUNT メッセージで SendMessage() を使用して、リスト項目の数を取得する必要があります。次に、リスト内の各アイテムの LB_GETTEXT メッセージで SendMessage() を呼び出す必要があります。
于 2008-12-17T16:40:08.467 に答える