ИЗМЕНИТЬ
Чтобы уточнить, нет намерения запускать это в производство. Чисто с точки зрения кодирования / автоматизации и игнорирования того факта, что существуют модули для выполнения вычислений, как бы можно было выполнить следующий запрос? Меня интересует, как VB6 может использовать API для взаимодействия с другими программами.
КОНЕЦ РЕДАКТИРОВАНИЯ
Используя VB6, мне интересно, можно ли запустить CALC.EXE, выполнить некоторые вычисления, а затем отправить значение обратно в текстовое поле в форме.
Ниже приведен код, который я пока тестирую:
API:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Нажатия кнопок:
Private Sub cmdStartCalc_Click()
Shell "calc.exe", vbNormalFocus
SendKeys "123"
End Sub
Private Sub cmdRetrieveValue_Click()
Dim hwnd As Long
' Gets set to 266558 when calc.exe is running, so I believe this is working
hwnd = FindWindow("SciCalc", "Calculator")
Dim text As String
text = Space(260)
Dim res As Long
' Res always returns 10 for some reason
res = GetWindowText(hwnd, text, 260)
txtValue.text = CStr(res)
End Sub
На ум приходит пара вещей - во-первых, если экземпляр Calc.exe уже был запущен, я не уверен, какой из них будет выбран FindWindow.
Во-вторых, было бы неплохо вернуть значение в Calc, когда мой экземпляр Calc.exe закрыт, но я открыт для использования кнопки для получения значения.
Возможно, есть лучший способ сделать это в .NET, но пока я привязан к VB6.
Приветствуется любое понимание.