tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル他アプリのグリッド情報の取得
記事No15105
投稿日: 2011/02/03(Thu) 23:18
投稿者とうあ
はじめて投稿します。
VB6年目のプログラマーです。よろしくお願いします。

アプリ間での連携をするために
他アプリ内のグリッド情報を取得する、VB6アプリを作成しようとしてます。
しかしグリッド情報の取得ができなく困っています。

他アプリのテキストボックス情報や、コントロールのタイトル名などは
SendMessage と WM_GETTEXT の組み合わせで
取得できることはわかっているのですが、グリッド内容の取得の仕方がわかりません。
ウィンドウハンドルを取得しても何をしたらいいのかわからない状態です。

Spy++でグリッドのクラス名を確認すると:

AfxOleControl42

となっていたので、何のコントロールなのか探してみたら、
vsFlexArrayのコントロールで同様のクラス名でした。

例えば1行3列目の項目情報を取得することは可能なのでしょうか?
内容の取得には関係ないと思いますが、
項目にはフォーカスを合わせることができません。

どなたかご教授よろしくお願い致します。
また参考になるような情報がありましたら是非教えてください。

[ツリー表示へ]
タイトルRe: 他アプリのグリッド情報の取得
記事No15106
投稿日: 2011/02/04(Fri) 02:21
投稿者花ちゃん
> 他アプリのテキストボックス情報や、コントロールのタイトル名などは
> SendMessage と WM_GETTEXT の組み合わせで
> 取得できることはわかっているのですが、

上記なら出来たのでしょうか?

>グリッド内容の取得の仕方がわかりません。
> ウィンドウハンドルを取得しても何をしたらいいのかわからない状態です。
同様に操作して見ましたか?

> 例えば1行3列目の項目情報を取得することは可能なのでしょうか?

ハンドルは、取得できているのでしょうか?
そのグリッドに表示されている全てのデータを取得したいとかと違いますよね。
個別のセルの(表示されている)データでハンドル等が取得できるのならあるいは
可能かも知れません。
一度、サンプル投稿用掲示板に魔界の仮面弁士さんが投稿された、マウスカーソル直下の
オブジェクト(文字列等)を取得(VB6.0) がありますので、それで試して見て下さい。
DataGridView に表示されたデータなら取得できましたが、貴方が取得したいグリッド
のデータが取得できるかは解りません。(MSHFlexGrid では取得できなかった)
Spy++で見ていたなら、セルのハンドルは取得できましたか?
そのグリッドのデータは、選択できるのでしょうか?
クリップボードにコピーできるとか?
その辺も出来ないとなるとチョット難しいかも知れません。

又、考えて見ても、自アプリに表示したグリッドのデータを取得するより簡単には
取得できるはずがありませんので、できなければ諦めた方がいいかも知れません。

又、他のアプリと言われてもどのような物なのか(VB製 とか 自分で作ったアプリとか)
私には解りませんので、代替策も現状では思いつきません。

[ツリー表示へ]
タイトルRe^2: 他アプリのグリッド情報の取得
記事No15107
投稿日: 2011/02/04(Fri) 11:06
投稿者とうあ
遅くにご返信ありがとうございます。
まず最初に他アプリとは他人が作ったVBのアプリです。


> 上記なら出来たのでしょうか?

SendMessage と WM_GETTEXTだと
テキストボックスの内容や、
フォームタイトル、
コマンドボタンのキャプションなどは取得できました。

> 同様に操作して見ましたか?

同様にvsFlexArrayに対して操作すると、キャプションらしい情報は取得できます。

らしいとは
VBからだとvsFlexArrayのプロパティにはキャプションという項目は
表示されないので、その辺はよくわかりません。
SendMessage とWM_SETTEXT でセットした情報を、WM_GETTEXT で取得できます。
SP++で見るとウインドウキャプションにその情報は入ります。

> ハンドルは、取得できているのでしょうか?
> Spy++で見ていたなら、セルのハンドルは取得できましたか?
> そのグリッドのデータは、選択できるのでしょうか?
> クリップボードにコピーできるとか?

vsFlexArrayのハンドルは取得できています。
Spy++ではグリッド全体を選択できますが、
セルだけを選択することはできませんでした。
セルのハンドル取得はどのようにするでしょうか?

入力セルは選択できますが、クリップボードにコピーはできません。
項目セルは選択できません。
項目セルをクリックするとその行全体の入力セルが選択されます。

魔界の仮面弁士さんが投稿された、マウスカーソル直下の。。。を試して見ました
残念ながら何も取得できませんでした。
vsFlexArrayのコントロールを使って適当なアプリを作りAddItemした値を、
取得できるか試しましたがこれもダメでした。


他に何か手があるようでしたら教えてください。
よろしくお願い致します。

[ツリー表示へ]
タイトルRe^3: 他アプリのグリッド情報の取得
記事No15108
投稿日: 2011/02/04(Fri) 12:59
投稿者花ちゃん
> まず最初に他アプリとは他人が作ったVBのアプリです。

それだけでは、何の情報にもならないかと。(貴方以外の人は同僚でも他人になるし)
そのアプリはどこで稼働しているとか、ソースコードもあるのか?
変更する事が可能かどうか?
データはどこにどのような形で保存されているのか?
等々が解らなければ代替案等は考えられないかと思いますが。

> 魔界の仮面弁士さんが投稿された、マウスカーソル直下の。。。を試して見ました
> 残念ながら何も取得できませんでした。
だったら、外部から取得する事は無理かと思いますよ。

> vsFlexArrayのコントロールを使って適当なアプリを作りAddItemした値を、
> 取得できるか試しましたがこれもダメでした。

vsFlexArrayのコントロール があるのなら、そのアプリが使っているデータにアクセス
する事はできないのですか?
それもだめなら、それこそあきらめた方がよさそうな気がしますが。

[ツリー表示へ]
タイトルRe^3: 他アプリのグリッド情報の取得
記事No15109
投稿日: 2011/02/04(Fri) 13:16
投稿者魔界の仮面弁士
> Spy++でグリッドのクラス名を確認すると:
> AfxOleControl42
> となっていたので、何のコントロールなのか探してみたら、
> vsFlexArrayのコントロールで同様のクラス名でした。
Visual C++ 4.0〜6.0 あたりで OCX を作った場合、
それが MFC のダイアログリソースだと、特にクラス名を指定しなければ
 AfxOleControl42
 AfxOleControl42d
といった名前が付くようになっていたかと思います。


また、プロセス間でのデータ交換と言っても、その方法は多岐にわたります。
中には通信には向かない物や、VB6 からの利用が不可能な物もありますが、
思いつくところでは:

DDE、オートメーション、DCOM、パイプ、クリップボード、WM_COPYDATA、
メールスロット、アクセシブル オブジェクト(MSAA)、ソケット、.NET Remoting、
ファイルマッピング、ドラッグアンドドロップ、データベース、レジストリ、
コマンドライン引数指定でのアプリ起動などなど。

なお、vsFlexArray だとしたら、外部からの操作は無理だと思います。
SendMessage で操作できるようにはなっていませんし、
アクセシブル オブジェクトが実装されている様子もありませんでしたから。

どうにかして、コントロールのインスタンスを取得できれば、そこから
TextMatrix メソッドを呼び出せるかも知れませんが、それも難しいでしょうね。



> 他アプリ内のグリッド情報を取得する、VB6アプリを作成しようとしてます。
「他アプリ」側の開発者と打ち合わせることは可能なのでしょうか?

SendMessage を使うにしても
 RichTextBox なら EM_GETTEXTEX メッセージ
 ListView    なら LVM_GETITEM  メッセージ
といったように、それぞれのコントロールに応じた操作手法が必要になりますから
相手のことを正しく知らないと通信は難しいと思いますよ。

しかも別プロセスが相手というなら、取得バッファのポインタは
共有メモリとして確保する必要があるといった制約も生じます。
http://home.netyou.jp/cc/susumu/shrmem.html

# 16bit 時代からある一部のメッセージでは、別プロセスであっても
# 共有メモリを使わなくて済むケースがありますが、それは特例ということで。


> しかしグリッド情報の取得ができなく困っています。
OS 標準のコントロールであれば、Microsoft が用意した API / Windows メッセージで
ある程度は操作が可能です。ですが、独自実装またはサードパーティ製品だったりすると
そもそも不可能か、あるいは取得手段が非公開という可能性が高いです。
(通常は、自アプリ以外からの操作を許容しないように作られる事が多いはず)

たとえば `仮` に『VB6 の Line メソッドと Print メソッドを駆使して作った表ソフト』が
あったとします。この場合、別アプリからグリッド情報を取得することができるでしょうか?
恐らくは無理のはずです。そのグリッドの情報を得るための手段を、そのアプリの製造者に
実装しておいてもらえば可能ですが、そうでなければ、画面イメージを画像解析して
文字列データを推測するのが関の山でしょう。

要は、グリッド側(またはそれを使っているアプリ側)に、グリッド情報を得るための機能が
実装されていなければ通信は無理という事です。たとえ実装されていたとしても、そこに
どのような通信方法が採用されているか分からなければコードを書くことはできない、
という事です。


> どなたかご教授よろしくお願い致します。
http://www.tt.rim.or.jp/~rudyard/torii009.html

[ツリー表示へ]
タイトル他アプリのグリッド情報の取得【解決】
記事No15110
投稿日: 2011/02/04(Fri) 14:59
投稿者とうあ
貴重な情報ありがとうございます。
AfxOleControl42という名前は、そういった使われ方をされているとは知りませんでした。
相手側のコントロールが特定できない以上通信できそうにありませんね。
「他アプリ」側の開発者とコンタクトはとれません。

> 実装しておいてもらえば可能ですが、そうでなければ、画面イメージを画像解析して
> 文字列データを推測するのが関の山でしょう。

取得できないので私も考えていました、データは英数字だけだったし、
しかし把握しているリソースを合わせても工数がかかりすぎます。

なので投稿させて頂きました。どなたか実例はご存知ないかな?と

現状では簡単に取得できないことも確認したかったので大変助かりました。
ご教示ありがとうございました。

[ツリー表示へ]