他のアプリのリストからテキスト取得 – プログラミング – Home

他のアプリのリストからテキスト取得
 
通知
すべてクリア

他のアプリのリストからテキスト取得


ゴンザ
 ゴンザ
(@ゴンザ)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

他のアプリを自動操作するソフトを作っているのですが、目的のアプリが持つリストボッ
クスから文字列を取得することは出来るのでしょうか?

ウインドウやキャプション、サイズなどは取得出来ていますが、コントロールの中身まで
は難しくて出来ていません。

環境
VC++ 6.0 SP5
Windows XPです。
宜しくお願いします。


引用解決済
トピックタグ
Jason
 Jason
(@Jason)
ゲスト
結合: 16年前
投稿: 26
 

DLLを作って、目的アプリにInjectしないといけないと思います。
Hook技術を利用して、目的アプリにInjectしてから、取得できると思ういますが、
十分な把握もありません。

ご参考まで。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

有効なHWNDに対してできることは、全てできるはず。
従ってSendMessage()でできることも、全てできるはずだと思ってましたが。
ど~なんでしょう。

ちなみに、リストボックスのアイテムの個数は

int Count = ( int)::SendMessage( hwnd_Listbox, LB_GETCOUNT, 0L, 0L);

ですよねぇ。
これってダメでしたか(質問)。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

追加MFCなんか使っちゃダメですよ。当たり前だけど。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

DLL Injection までは必要ありませんが、少々面倒ですよ。

リストボックスのアイテムテキストを取得するには LB_GETTEXT メッセージを投げます。
が、このメッセージを受け取った他アプリのリストボックスは、lParam に指定された文
字列ポインタが自プロセスのメモリ空間を指しているものとして、そこに書き込みます。
結果、文字列を取得できないばかりか、他アプリのメモリ空間を破壊することにもなりか
ねません。

噛み砕いて言うと、
プロセスはそれぞれ、独立した家だと考えます。家の中にはテーブルがあります。
自分の家のテーブルの上には何も乗っていないことが見て分かっても、他人の家のテーブ
ルの上がどうなっているかはわかりません。
他人の家のリストボックスに「アイテムテキストを紙に書いてテーブルの上に置いとい
て」と言っても、リストボックスは紙をその家のテーブルの上に置くだけです。
しかも、もともとそこに何か置いてあったら、それをどかしてから置いてしまいます。も
ともと置いてあったものは行方不明になってしまいますし、ウチのテーブルの上には相変
わらず何も置いてありません。
ここで、「あんたの家のリストボックスの内容を紙に書いて、ウチのテーブルの上に置い
て」とお願いすることはできません。

ではどうやるかというと、
 まず対象プロセスの中にメモリ空間を確保し(VirtualAllocEx)
 そのアドレスを指定してテキストを取得し(LB_GETTEXT)
 相手プロセスのメモリ空間を読み取り(ReadProcessMemory)
 それを開放する(VirtualFreeEx)
という流れが必要になります。

例えばなしで言うと、
 まず相手に「どこか場所取っといて」とお願いし
 「その場所にリストアイテムの内容を書いた紙を置いといて」とお願いし
 相手の家にお邪魔して紙を回収し
 「もうその場所使わないからとっとかなくていいよ」と伝える
という感じです。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

GetWindowText はそういうことを自動で面倒見てくれてます。


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

もしかしたら LB_GETTEXT でも正常に動作したりするかもしれない。
古い情報なんで今どうなっているかは判らないけど一応紹介。
http://www.microsoft.com/msj/0997/win320997.aspx

以下↑リンク先の最初のQuestionの要約

Q1、
他プロセスの ListView のテキスト取得に失敗した。原因は判ってる。でも試しに ListBox
でやるとテキスト取得に成功した?何故だ??

A1、
16-bit Windows では全アプリが 1 つのプロセスで動いていた。そのため他アプリに対し
ても好き放題できた。
32-bit Windows へ移り、アプリはマルチプロセスで動くようになった。が、そうすると
好き放題できなくなりアプリの互換性に問題が出る。なので、コントロールの特定のメッ
セージについてはプロセスが異なっていても正常動作するように我々がしてあげた。
ListView で NG なのは Microsoft が特別な処理をしていないからで、ListBox で OK な
のは MS が特別に面倒見てあげているからだ。ListView でテキスト取得したいのならば、
aetos さんが示してくれているように VirtualAllocEx を使うと可能だよ。


返信引用
ゴンザ
 ゴンザ
(@ゴンザ)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

皆様、貴重なご回答ありがとうございます。
早速試してみます。m(_ _)m


返信引用
ゴンザ
 ゴンザ
(@ゴンザ)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

いろいろと試しましたが私には無理なようなので諦めます。
ありがとうございました。


返信引用
熊谷隆史
 熊谷隆史
(@熊谷隆史)
ゲスト
結合: 16年前
投稿: 2
 

取り合えず、AccExplorer32で確認されてはどうでしょうか。
案外、IAccessibleで取れるかもです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました