19

Windows アプリケーションが別のアプリケーション データ、具体的には GUI のテキスト入力フィールドにアクセスし、そこにあるテキストを取得して、独自のアプリケーションで処理する方法はありますか?

可能であれば、それを防ぐためにアプリケーションを「シールド」する方法はありますか?

EDIT:最初の3つの答えは、そのウィンドウの特定のテキスト入力フィールドではなく、別のアプリケーションウィンドウのタイトルを取得することに関するものです。

私はWindows APIを期待していないので、そのウィンドウで特定のテキストフィールドを見つける方法をより正確に教えてください.どうすればそれを取得できますか?など...)

C++ のコード スニペットは本当にありがたいです。Win32-API にはひどい命名規則があるため、MSDN のヘルプを参照するのは困難です。

完成!C++ でのハウツーについては、以下の私の回答を参照してください。

4

6 に答える 6

18

別のアプリケーションのテキスト ボックスからテキスト コンテンツを読み取るには、そのテキスト ボックス コントロールのウィンドウ ハンドルを取得する必要があります。アプリケーション UI の設計方法 (UI がある場合) に応じて、このハンドルを取得するために使用できる方法がいくつかあります。「FindWindow」/「FindWindowEx」を使用してコントロールを見つけるか、「WindowFromPoint」を使用することが理にかなっている場合があります。いずれにしても、テキスト コントロールへのハンドルを取得したら、"WM_GETTEXT" メッセージを送信してその内容を取得できます (標準のテキスト ボックス コントロールであると仮定します)。これが作成されたサンプルです(エラーチェックなし):

HWND hwnd = (HWND)0x00310E3A;
char szBuf[2048];
LONG lResult;

lResult = SendMessage( hwnd, WM_GETTEXT, sizeof( szBuf ) / sizeof( szBuf[0] ), (LPARAM)szBuf );
printf( "Copied %d characters.  Contents: %s\n", lResult, szBuf );

「Spy++」を使用して、たまたま横たわっていたテキスト ボックス ウィンドウのハンドルを取得しました。

独自のテキスト ボックスがこのように検査されないように保護するために、常にテキスト ボックスをサブクラス化し (「nIndex」パラメーターについては「GWL_WNDPROC」を使用した「SetWindowLong」を参照)、「WM_GETTEXT」メッセージの特別な処理を行って、同じプロセスからのリクエストのみが処理されるようにします。

于 2008-12-11T17:47:48.127 に答える
1

AutoHotkeyを見てください。アプリケーションに API が必要な場合は、そのソースを参照してください。これを防ぐには、WinForms、MFC、または Win32 API の代わりにカスタム ウィジェットを使用してください。それは絶対確実ではありませんが、役立ちます。

于 2008-12-09T09:45:59.693 に答える
0

はい、さまざまな方法で可能です (1 つの方法は、WINAPI GetWindow および GetWindowText を使用することです)。

まず、テキストを取得するテキスト ボックスのハンドルを取得します (FindWindow、EnumChildWindows、およびその他の API を使用)。

古い VB6 コード例、API の宣言:

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long  
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long  

テキストを抽出するコード:

Dim MyStr As String
MyStr = String(GetWindowTextLength(TextBoxHandle) + 1, Chr$(0))
GetWindowText TextBoxHandle, MyStr, Len(MyStr)
MsgBox MyStr
于 2008-12-09T09:47:09.333 に答える
-1

EM_GETTEXTRANGE メッセージを使用してリッチエディット コントロールからテキストを取得することもできますが、これはコントロールが作成された同じプロセスでのみ機能します。

于 2008-12-13T12:29:56.730 に答える
-1

それを防ぐためにアプリケーションをシールドする方法については、多くのことができます。1 つの方法は、テキストを作成するテキスト入力を処理するための独自のコントロールを用意することです。たとえば、テキストが配置される場所にいくつかのラベルを配置したり、テキストをグラフィカルに描画したりします。

于 2008-12-09T09:50:03.100 に答える