プロが教える店舗&オフィスのセキュリティ対策術

●やりたいこと
ExcelVBAで、APIを実行し、外部ソフトのウィンドウに含まれている
エディットテキストを取得して、セルに出力したい

使用する関数・宣言、できればコードを教えていただけませんでしょうか。

イメージはこちらをご参考いただけると幸いです。
http://situmon-img.blogspot.com/2008/08/1.html

変数hwindowに親ウィンドウのハンドルが取得されています。
エディットボックスのハンドル、IDは分かりません。


エディットボックスのハンドルを取得し、
分かっているクラス・ハンドルの文字列を取得
といった流れになるのではと思っております。

変数にさえ文字列が取得できれば、
当然ですが、Range("B2")=変数 で大丈夫です。
変数は、ひとつを使いまわしで構いません。
変数をエディットテキストの数だけ用意しても構いません。

A 回答 (4件)

あの QNo.4256138の質問でも、同じ様な事を質問されていたと思います。


出来たらそちらで質問された方がよかったのではと思います。

テキストボックスの取得も、私の回答した全く同じ方法で
取得出来ると思います。クラス名が Edit になるだけです。

 EnumChildWindows(hWnd,lpEnumFunc,0&) は、親ウィンドウに含まれる

子ウィンドウがすべて返ってきます。ボタンもテキストボックスも、その他の
子ウィンドウがすべて、何個あっても、取得できます。

ただ EnumChildWindows(hWnd,lpEnumFunc,0&) で与える子ウィンドウを
受け取る関数は、コールバック関数なので、1回のコールで1個の子ウィンドウ
しか返ってきません。ただ、子ウィンドウがある分だけ何度も同じ関数が
呼び出されます。よび出される度に

 GetClassName(hWnd,lpClassName,nMaxCount) でクラス名を取得し

クラス名が Edit ならテキストボックスになります。

SendMessage(テキストボックスハンドル, &HD, 240, ByVal cbuf)

で cbuf にテキストボックスの文字が取得出来ます。

尚、cbuf は文字長を多い目に事前に確保しておきましょう。

cbufのNULL値までが実際の文字となります。

また、コールバック関数はデバッグモードで、ブレークさすと、
フリーズするので注意して下さい。通常はデバッグしにくいので、
コールバック関数内では、配列変数にハンドルをためこんでいきます。
その後で、配列にためこんでいるハンドルを順番にクラス名を取得し
テキストがボタンか判断していきます。
    • good
    • 0
この回答へのお礼

度々ご返答いただき誠にありがとうございます。
具体的で即使えるように記載いただき非常に助かります。
基本を勉強してないのでエラーしまくりですが、何とか進めております。

お礼日時:2008/08/19 16:23

#3の回答者です。



EnumChildWindows(hWnd,lpEnumFunc,0&) で登録した子ウィンドウを
受け取る関数は、その関数を終了する時に TRUE を返す様に
しないと、全ての子ウィンドウのハンドルを受け取れませんので
注意して下さい
    • good
    • 0

No.1の回答者です。



誤:
FindWindowEx の第二パラメータに設定します)

正:
FindWindowEx の第4パラメータに設定します)

です。失礼しました。
    • good
    • 0

まず、Spy++ や フリーウェア(Winspectorなど)を使って、エディットボックスのクラス名かキャプション名を得てください。



その後、FindWindowEx API を使って親から階層を手繰ってください。
例えば、親の1階層下に "Frame"クラスのコントロールがあり、さらにその中に対象とするエディットボックス "Edit" が存在するとしたら、
hFrame = FindWindowEx(親ハンドル, 0, "Frame", 0)
hEdit = FindWindowEx(hFrame, 0, "Edit", 0)
(尚、クラス名ではなくウィンドウキャプションで取得する場合は、FindWindowEx の第二パラメータに設定します)

ここまできたら、あとは
Dim strText As String
strText = Space(2048)
SendMessage(hEdit, WM_GETTEXT, strText, Len(strText))
strText = Left(strText, Len(strText)-1)
strText = Trim(strText)
という感じになるかと思います。

考え方だけですので適宜微調整はお願いしますね。
    • good
    • 0
この回答へのお礼

具体的な例ありがとうございます。
取得した後の詳しい説明、本当にありがとうございます。
参考に試行錯誤しております。

お礼日時:2008/08/19 16:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A