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

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

A 回答 (5件)

電卓アプリに、結果を外部に返すインターフェイスが無ければ、無理だと思いますよ。



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

もしかしたら的外れかもしれません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/07/28 15:56

SendKeysでCTRL+Cを送るとかぐらいでしょうかねぇ。



電卓ぐらいなら自作する方がより確実かと。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/07/28 15:58

・電卓のウィンドウハンドル取得


・電卓ウィンドウの中のEditコントロールのウィンドウハンドル取得
・取得したEditコントロールのウィンドウハンドルめがけてWM_GETTEXTメッセージを送る

このような手順になります。
後半二つについては、C++ですが、以下のページが参考になります。
http://homepage2.nifty.com/DSS/VCPP/API/GetWindo …

最初の、電卓のウィンドウハンドルについては、手っ取り早いのは「電卓」という文字列でFindWindow APIを使うことですが、他にも方法はあります。

APIについてそれ相応の知識が必要になります。
ここに全てのソースを記すのはちょっと厳しいので、色々探してみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/07/28 16:29

Windows XP に標準でついている電卓なら


計算結果がコピー(Ctrl+C)できますので
クリップボード経由で 反映できるかも

他のバージョンは。。。
 わかりません^^;
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/07/28 16:00

No.3のspace_needleです。



ソースを拝見したのですが、もしかしたら電卓を閉じる寸前に表示されていた内容を取得したい、ということでしょうか。

私はてっきり、「内容の取得」ボタンのようなものがあって、それを押したときに取得するのかと思っていました。

もし閉じる寸前の内容、ということであれば、値が返ってきたり返ってこなかったり、という問題を解決するのは、私が知る限り不可能です。

電卓が閉じられるときに、Editコントロールの内容は破棄されます。
破棄されるのが先か、取得するのが先か、という競争になってしまうからです。

また、ループ中でメッセージを投げ続けるのも、動作が不安定になる原因になりますので、危険な処理です。

No.2のpopesyu様の回答のように、電卓を自作するほうが良いかと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/07/28 20:47

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