他のアプリを自動操作するソフトを作っているのですが、目的のアプリが持つリストボッ
クスから文字列を取得することは出来るのでしょうか?
ウインドウやキャプション、サイズなどは取得出来ていますが、コントロールの中身まで
は難しくて出来ていません。
環境
VC++ 6.0 SP5
Windows XPです。
宜しくお願いします。
DLLを作って、目的アプリにInjectしないといけないと思います。
Hook技術を利用して、目的アプリにInjectしてから、取得できると思ういますが、
十分な把握もありません。
ご参考まで。
有効なHWNDに対してできることは、全てできるはず。
従ってSendMessage()でできることも、全てできるはずだと思ってましたが。
ど~なんでしょう。
ちなみに、リストボックスのアイテムの個数は
int Count = ( int)::SendMessage( hwnd_Listbox, LB_GETCOUNT, 0L, 0L);
ですよねぇ。
これってダメでしたか(質問)。
追加MFCなんか使っちゃダメですよ。当たり前だけど。
DLL Injection までは必要ありませんが、少々面倒ですよ。
リストボックスのアイテムテキストを取得するには LB_GETTEXT メッセージを投げます。
が、このメッセージを受け取った他アプリのリストボックスは、lParam に指定された文
字列ポインタが自プロセスのメモリ空間を指しているものとして、そこに書き込みます。
結果、文字列を取得できないばかりか、他アプリのメモリ空間を破壊することにもなりか
ねません。
噛み砕いて言うと、
プロセスはそれぞれ、独立した家だと考えます。家の中にはテーブルがあります。
自分の家のテーブルの上には何も乗っていないことが見て分かっても、他人の家のテーブ
ルの上がどうなっているかはわかりません。
他人の家のリストボックスに「アイテムテキストを紙に書いてテーブルの上に置いとい
て」と言っても、リストボックスは紙をその家のテーブルの上に置くだけです。
しかも、もともとそこに何か置いてあったら、それをどかしてから置いてしまいます。も
ともと置いてあったものは行方不明になってしまいますし、ウチのテーブルの上には相変
わらず何も置いてありません。
ここで、「あんたの家のリストボックスの内容を紙に書いて、ウチのテーブルの上に置い
て」とお願いすることはできません。
ではどうやるかというと、
まず対象プロセスの中にメモリ空間を確保し(VirtualAllocEx)
そのアドレスを指定してテキストを取得し(LB_GETTEXT)
相手プロセスのメモリ空間を読み取り(ReadProcessMemory)
それを開放する(VirtualFreeEx)
という流れが必要になります。
例えばなしで言うと、
まず相手に「どこか場所取っといて」とお願いし
「その場所にリストアイテムの内容を書いた紙を置いといて」とお願いし
相手の家にお邪魔して紙を回収し
「もうその場所使わないからとっとかなくていいよ」と伝える
という感じです。
GetWindowText はそういうことを自動で面倒見てくれてます。
もしかしたら 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 を使うと可能だよ。
皆様、貴重なご回答ありがとうございます。
早速試してみます。m(_ _)m
いろいろと試しましたが私には無理なようなので諦めます。
ありがとうございました。
取り合えず、AccExplorer32で確認されてはどうでしょうか。
案外、IAccessibleで取れるかもです。