• ベストアンサー

VBで作成したフォーム上に電卓アプリの計算結果を反映させたい

現在VB6.0でプログラミングをしています。VBのフォームから電卓アプリを呼び出し、その計算結果をVBのフォーム上のテキストに反映させたいのです。 電卓をsehll関数で起動させることはできるのですが・・・。 現在ネットなどでいろいろ調べているのですが行き詰っています。 何かよい方法をご存知の方がいましたら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

・電卓のウィンドウハンドル取得 ・電卓ウィンドウの中のEditコントロールのウィンドウハンドル取得 ・取得したEditコントロールのウィンドウハンドルめがけてWM_GETTEXTメッセージを送る このような手順になります。 後半二つについては、C++ですが、以下のページが参考になります。 http://homepage2.nifty.com/DSS/VCPP/API/GetWindowTextAndEdit.htm 最初の、電卓のウィンドウハンドルについては、手っ取り早いのは「電卓」という文字列でFindWindow APIを使うことですが、他にも方法はあります。 APIについてそれ相応の知識が必要になります。 ここに全てのソースを記すのはちょっと厳しいので、色々探してみてください。

gabera
質問者

お礼

ありがとうございます。 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

その他の回答 (4)

回答No.5

No.3のspace_needleです。 ソースを拝見したのですが、もしかしたら電卓を閉じる寸前に表示されていた内容を取得したい、ということでしょうか。 私はてっきり、「内容の取得」ボタンのようなものがあって、それを押したときに取得するのかと思っていました。 もし閉じる寸前の内容、ということであれば、値が返ってきたり返ってこなかったり、という問題を解決するのは、私が知る限り不可能です。 電卓が閉じられるときに、Editコントロールの内容は破棄されます。 破棄されるのが先か、取得するのが先か、という競争になってしまうからです。 また、ループ中でメッセージを投げ続けるのも、動作が不安定になる原因になりますので、危険な処理です。 No.2のpopesyu様の回答のように、電卓を自作するほうが良いかと思います。

gabera
質問者

お礼

ご回答ありがとうございました。 電卓を閉じる寸前に表示されていた内容を取得したかったのですが、あきらめました。でもspace_needlさんのおっしゃるような「内容の取得」ボタンを使用して取得することにしました。結果、上手くいきました。 本当にありがとうございます。

  • blo-old
  • ベストアンサー率0% (0/3)
回答No.4

Windows XP に標準でついている電卓なら 計算結果がコピー(Ctrl+C)できますので クリップボード経由で 反映できるかも 他のバージョンは。。。  わかりません^^;

gabera
質問者

お礼

ありがとうございます。クリップボードですね。調べてみようと思います。

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.2

SendKeysでCTRL+Cを送るとかぐらいでしょうかねぇ。 電卓ぐらいなら自作する方がより確実かと。

gabera
質問者

お礼

ありがとうございます。実はまだ電卓を作成したことはないのですが、もう少し粘った結果そうなるかもしれません。その際、分からないことがあったらまたよろしくお願いします。

noname#25230
noname#25230
回答No.1

電卓アプリに、結果を外部に返すインターフェイスが無ければ、無理だと思いますよ。 もしインターフェイスが無いのに電卓内部の処理を盗み見られるのであれば、ソフトウェアとしてのセキュリティに問題があることになりますよね(ブラウザアプリ内部のデータを盗み見できるのであれば、それを会社のPCなどに仕掛ければ、パスワードや昼休みの個人利用時のID、パスワードなどが収集できてしまいます)。 もしかしたら的外れかもしれません。

gabera
質問者

お礼

ありがとうございます。そうですか。まだまだ未熟者で知識が浅いので勉強になりす。 でももう少しAPIなどの勉強もかねてねばってみようと思います。

関連するQ&A

  • Access2007 フォームでの計算結果をテーブルに反映させるには?

    ビスタでAccess2007を使っています あるテーブルにA~Dまでのフィールドが設定されています。 フォームでフィールドA.Bは手入力して C.Dには計算式を設定して計算結果を表示させていますがテーブルに反映されません。 (フォームにはきちんど式通りの答えが表示されますがテーブルのフィールドC.Dは空っぽです。) 例 A・・・10,000 B・・・0.1 C・・・1,000(計算式 A*B) D・・・9,000(計算式 A-C) フォーム上で行った計算結果をテーブルに入力反映させるにはどうすればよいでしょうか? テーブルやフォームの作り方が悪いのか? 計算式の設定が悪いのか? なぜテーブルに反映しないのか理由がわかりません。 そもそもフォーム上での計算はテーブルには反映しないのか? だとすれば反映させるにはどうすればよいのでしょうか? テーブルのフィールドに計算式を設定することは出来るのでしょうか? 出来るとすればその方法は? 疑問だらけでどうすれば求める結果が得られるのかさっぱり解りません。 当方Access2007は初心者も同然ですのでわかりやすく解説して戴ければ幸いです。 よろしくご教授ください。

  • 関数電卓の計算結果が-

    大学で関数電卓を使うことになり、今使い方を説明書を見ながら確認していました。積分問題を試しに計算してみたのですが、どうも計算結果が合いません。どなたかその原因を教えていただけませんでしょうか。 例えば、 ∫[区間:0からπ]x^2sinxdx を計算すると、π^2-4(=5.8696・・・)になりますが、関数電卓で 説明書の手順通り ∫(X^2sinX, 0, π)= と入力すると0.424・・・ という計算結果が表示されます。 これは何故でしょうか。おわかりになる方、よろしくお願い致します。

  • フォームのテキストコントロールに代入された計算式を計算したい

    VB.Netのイベントで、フォームのテキストコントロールに代入された計算式を計算したいのです。 (String変数に代入された値でも構いません) 計算式.textに "3*4+5"等の計算式が代入されているとします。 これを計算して結果を変数に代入させたいのですが、Textになっているので、どうすればよいか分かりません。 よい方法を教えて下さい。

  • windowsの最初から入っている電卓の計算結果をコピーしたい

    vistaです。 windowsの最初から入っている電卓は 計算結果をコピーすることはできないのでしょうか? マウスで選択すらできません。 こうなったら自分でvbなどで電卓を作るしかないですか?

  • シャープ方式の電卓アプリはありますか?

    主にAndroid機種を使っていますが、iPhone向けも同時にお伺いできればと思います。 当然ながら、というか、シャープのスマートフォンやタブレットには、シャープの電卓と同じような配列及び計算方式の電卓が入っています。 そのようなアプリを探しています。iPhoneや主に使用しているXperia内蔵の電卓は、配列はともかく、計算方法が関数計算?なのでしょうか、恐らく海外スタンダードなのかの方式で、数字と記号が横に羅列されていくかと思います。 悪いわけではないので批判でも何でもなく、それはそれで逆にメリットがあるのでいいのですが、私が小さい頃から算盤や電卓を検定を視野にいれて練習してきたり、簿記なんかもやって来た関係で、どうしても筆算や伝票算というのでしょうか、一列毎に結果が出ていく方式の方が馴染みがあって計算しやすくて。 本当はいっそシャープ製スマートフォンにしたいのですが、諸事情でなかなか変えれないので、アプリでないか探しているのですがなかなか見つからなくて・・。 どなたか、ご存知の方がいらっしゃいましたら教えていただけましたら幸いです。よろしくお願いいたします。

  • vb.net 2008にて、アプリ起動時にフォームを非表示にする方法をお教えください。

    dim str as string dim f1 as new form1(str) f1.showdaialog() 上記のように変数を伴って別フォームより、非表示で起動したいフォームを呼び出しております。 vb.netではアプリのロードイベントにて、me.visible =false 等で非表示にできないことをしりました。 そこで、http://dobon.net/vb/dotnet/form/hideformwithtrayicon.htmlを参考にいろいろと試してみましたがだめでした。 フォームを宣言する際、引数を必要としている作りであるため、上記URLの パラメータを指定せずにApplication.Runを呼び出す方法が使えないため、 フォーム最小化、タスクバー非表示の方法を用いてみると、アプリが終了してしまいました。 次に、タイマーを使い、me.visible= falseとすると、その場合もアプリが終了してしまいました。 また、タイマーイベント内にて、フォーム最小化、タスクバー非表示の方法を試してみても、アプリが終了する結果となりました。 フォームがウィンドウ画面から確認できない状態になるとアプリが終了する仕様になってしまったのでしょうか。 また、この現象を回避し、起動時にフォームを非表示にする方法があればお教えください。

  • vbで作成したアプリをサービスとして実行

    vbで作成したフォームアプリケーションをサービスに登録し、Windowsが起動時に自動で実行するようにしたいのですが、vbで作成したフォームアプリケーションをサービスに登録する方法がわからないのでわかる方がいらしたら、教えていただきたいと思います。 アプリの動作は、デバイスの抜き差しの監視アプリです。

  • VB.netで電卓プログラム作成

    VB.netの勉強中で電卓プログラム作成を行っています。 皆様に教えて頂きたいのは、たとえば0,1,2,3,4,5,6,7,8,9と ボタンでキーを作ったとします。 プログラムの中でどのボタンが押されたかどうかが判る関数や、宣言の方法がありますか? もしくはTEMPなどの引数をつくり、+-・x=が押されるまで、 数値を記憶させる方法はどの様な手段がありますか? ヒントになる様なレベルで構いませんので回答頂けますよう よろしくお願いいたします。

  • VBのフォームを・・・

    VB.NETで作ったフォームを、 (1)ブラウザ上で表示する (2)Flashのボタンを押すことによって、VBのフォームを表示する 以上の(1)か(2)の方法は可能でしょうか? 本当に困っています。初心者すぎて申し訳ありませんが、ご存知の方はどうかよろしくお願いします!

  • VB6.0のフォーム間の関数呼び出しについて

    VB6.0のフォーム間の関数呼び出しについて いつもお世話になっております。 これまでVB2005で開発を行ってきたのですが、 これまでの資産の関係上VB6.0での開発を行う必要が出てまいりました。 現在下記のようになっております。 フォーム1:Form1    関数:keisan フォーム2:Form2 Form1ではテキストボックスコントロールを利用した関数keisanがあります。 その関数をForm2上から呼び出すことは可能でしょうか? 以下のやり方では実行できそうでしょうか? call Form1.keisan 初歩的な質問で申し訳ございません。 なにとぞアドバイスをいただけると幸いです。