- ベストアンサー
VBで作成したフォーム上に電卓アプリの計算結果を反映させたい
現在VB6.0でプログラミングをしています。VBのフォームから電卓アプリを呼び出し、その計算結果をVBのフォーム上のテキストに反映させたいのです。 電卓をsehll関数で起動させることはできるのですが・・・。 現在ネットなどでいろいろ調べているのですが行き詰っています。 何かよい方法をご存知の方がいましたら教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
・電卓のウィンドウハンドル取得 ・電卓ウィンドウの中のEditコントロールのウィンドウハンドル取得 ・取得したEditコントロールのウィンドウハンドルめがけてWM_GETTEXTメッセージを送る このような手順になります。 後半二つについては、C++ですが、以下のページが参考になります。 http://homepage2.nifty.com/DSS/VCPP/API/GetWindowTextAndEdit.htm 最初の、電卓のウィンドウハンドルについては、手っ取り早いのは「電卓」という文字列でFindWindow APIを使うことですが、他にも方法はあります。 APIについてそれ相応の知識が必要になります。 ここに全てのソースを記すのはちょっと厳しいので、色々探してみてください。
その他の回答 (4)
- space_needle
- ベストアンサー率48% (174/362)
No.3のspace_needleです。 ソースを拝見したのですが、もしかしたら電卓を閉じる寸前に表示されていた内容を取得したい、ということでしょうか。 私はてっきり、「内容の取得」ボタンのようなものがあって、それを押したときに取得するのかと思っていました。 もし閉じる寸前の内容、ということであれば、値が返ってきたり返ってこなかったり、という問題を解決するのは、私が知る限り不可能です。 電卓が閉じられるときに、Editコントロールの内容は破棄されます。 破棄されるのが先か、取得するのが先か、という競争になってしまうからです。 また、ループ中でメッセージを投げ続けるのも、動作が不安定になる原因になりますので、危険な処理です。 No.2のpopesyu様の回答のように、電卓を自作するほうが良いかと思います。
お礼
ご回答ありがとうございました。 電卓を閉じる寸前に表示されていた内容を取得したかったのですが、あきらめました。でもspace_needlさんのおっしゃるような「内容の取得」ボタンを使用して取得することにしました。結果、上手くいきました。 本当にありがとうございます。
- blo-old
- ベストアンサー率0% (0/3)
Windows XP に標準でついている電卓なら 計算結果がコピー(Ctrl+C)できますので クリップボード経由で 反映できるかも 他のバージョンは。。。 わかりません^^;
お礼
ありがとうございます。クリップボードですね。調べてみようと思います。
- popesyu
- ベストアンサー率36% (1782/4883)
SendKeysでCTRL+Cを送るとかぐらいでしょうかねぇ。 電卓ぐらいなら自作する方がより確実かと。
お礼
ありがとうございます。実はまだ電卓を作成したことはないのですが、もう少し粘った結果そうなるかもしれません。その際、分からないことがあったらまたよろしくお願いします。
電卓アプリに、結果を外部に返すインターフェイスが無ければ、無理だと思いますよ。 もしインターフェイスが無いのに電卓内部の処理を盗み見られるのであれば、ソフトウェアとしてのセキュリティに問題があることになりますよね(ブラウザアプリ内部のデータを盗み見できるのであれば、それを会社のPCなどに仕掛ければ、パスワードや昼休みの個人利用時のID、パスワードなどが収集できてしまいます)。 もしかしたら的外れかもしれません。
お礼
ありがとうございます。そうですか。まだまだ未熟者で知識が浅いので勉強になりす。 でももう少しAPIなどの勉強もかねてねばってみようと思います。
お礼
ありがとうございます。 APIを使っていろいろと試しているのですが以下の記述(長くなってしまったので一部分ですが・・・)でテキストに値が返ってきました。ですが、問題なのが値が返ってきたり返ってこなかったりするのです。まだAPIというものを良く理解していないので何故なのか検討もつきません。もし何かお気づきの点がありましたら教えてください。よろしくお願いします。 Private Sub Command1_Click() Dim INST As Long Dim PROCESS As Long Dim MODORITI As Long Dim ENDWORK As Long Dim lngWindWnd As Long 'ウィンドウハンドル Dim ret As Long Dim hCalc As Long Dim TextBuff(20) As Byte 'メモ帳の文字列格納バイト配列 Dim EditTextLen As Long 'メモ帳の文字列サイズ Dim gTextBuff As String '取得した文字列 ' システムエディタを起動 INST = Shell("Calc", 2) 'システムエディタのプロセスを取得する PROCESS = OpenProcess(1024 Or 1048576, True, INST) 'アプリケーションタイトルより、ウィンドウハンドルを得ます lngWindWnd = FindWindow(vbNullString, "電卓") hCalc = FindWindowEx(lngWindWnd, 0, "Edit", "") 'システムエディタが閉じられるまで処理を中断(ループさせる) Do While 1 'メモ帳の文字列サイズ取得 EditTextLen = GetEditboxLenB(hCalc) 'メモ帳からテキスト取得 ret = SendMessage(hCalc, WM_GETTEXT, EditTextLen + 1, TextBuff(0)) MODORITI = GetExitCodeProcess(PROCESS, ENDWORK) 'システムエディタが終了したら処理中断(ループ)を解除する If ENDWORK <> 259 Then MsgBox "shori end" Exit Do End If Loop 'ANSI→ UNICODE変換 gTextBuff = StrConv(TextBuff(), vbUnicode) 'GetEditboxText = strNullCut(gTextBuff) Text1.Text = strNullCut(gTextBuff) End Sub