問題の電卓プログラムは、Form1.vb[デザイン]にボタン1つと入力用TextBox1と出力用TextBox2をつけて下記コードで作りました。
※質問が長すぎるとのことで、コードはコメント欄にあります。
こんな感じでしょうか?
(なぜか%{F4}を取りこぼす場合があるようなので、%{F4}のリトライ処理を入れています)
Public Class Form1 Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Integer) As Integer 'お約束のボタン Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox2.Text = CCalc(TextBox1.Text) TextBox1.Focus() End Sub 'Windowsアクセサリの電卓Calcを呼出して計算結果を文字列で取得する関数 Private Function CCalc(ByVal expr As String) As String Dim res As String = "" Dim newProc As Diagnostics.Process If Microsoft.VisualBasic.Right(expr, 1) <> "=" Then expr += "=" 'クリップボードに文字列をコピー Clipboard.SetDataObject(expr) 'Windowsアクセサリの電卓Calcを呼出す newProc = Diagnostics.Process.Start("C:\WINDOWS\system32\Calc.exe") newProc.WaitForInputIdle(1000) SetForegroundWindow(newProc.MainWindowHandle) 'SendKeysで計算式を送って計算結果をクリップボードにコピーしてCalcを終了 My.Computer.Keyboard.SendKeys("^v^c%{F4}", True) 'Calcが計算終了するのを待つ 'MsgBox("Ready ?", MsgBoxStyle.Question) While newProc.WaitForExit(500) = False SetForegroundWindow(newProc.MainWindowHandle) My.Computer.Keyboard.SendKeys("%{F4}", True) End While 'クリップボードに文字列データがあるか確認して文字列データがあれば取得 If Clipboard.ContainsText() Then res = Clipboard.GetText() CCalc = res End Function End Class
[VB] Shell 関数で起動したプログラムの終了を待つ方法
http://ameblo.jp/archive-redo-blog/entry-10033356292.html
VB2008でもたぶんいけると思うのですが...
回答ありがとうございました。試してみましたが、駄目でした。
「1+1」を入力してボタンを押したらたら、「1+1=」と返してきました。MsgBoxを復活させたら、「2」を返してします。
こんな感じでしょうか?
(なぜか%{F4}を取りこぼす場合があるようなので、%{F4}のリトライ処理を入れています)
Public Class Form1 Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Integer) As Integer 'お約束のボタン Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox2.Text = CCalc(TextBox1.Text) TextBox1.Focus() End Sub 'Windowsアクセサリの電卓Calcを呼出して計算結果を文字列で取得する関数 Private Function CCalc(ByVal expr As String) As String Dim res As String = "" Dim newProc As Diagnostics.Process If Microsoft.VisualBasic.Right(expr, 1) <> "=" Then expr += "=" 'クリップボードに文字列をコピー Clipboard.SetDataObject(expr) 'Windowsアクセサリの電卓Calcを呼出す newProc = Diagnostics.Process.Start("C:\WINDOWS\system32\Calc.exe") newProc.WaitForInputIdle(1000) SetForegroundWindow(newProc.MainWindowHandle) 'SendKeysで計算式を送って計算結果をクリップボードにコピーしてCalcを終了 My.Computer.Keyboard.SendKeys("^v^c%{F4}", True) 'Calcが計算終了するのを待つ 'MsgBox("Ready ?", MsgBoxStyle.Question) While newProc.WaitForExit(500) = False SetForegroundWindow(newProc.MainWindowHandle) My.Computer.Keyboard.SendKeys("%{F4}", True) End While 'クリップボードに文字列データがあるか確認して文字列データがあれば取得 If Clipboard.ContainsText() Then res = Clipboard.GetText() CCalc = res End Function End Class
回答ありがとうございます。試してみたら、実際、動作しました。ちょっと欲張りですが、Calcを使っていることが分からないように隠して使うのはやっぱり無理でしょうか。(^_^;
まだまだVBは勉強中なので的外れだったら済みません。
↓が参考になれば幸いです。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1015045...
回答ありがとうございます。うーん、ちょっと違うような。(^_^;
回答ありがとうございます。試してみたら、実際、動作しました。ちょっと欲張りですが、Calcを使っていることが分からないように隠して使うのはやっぱり無理でしょうか。(^_^;