Запустите CALC.EXE и получите значение с помощью VB6.

ИЗМЕНИТЬ

Чтобы уточнить, нет намерения запускать это в производство. Чисто с точки зрения кодирования / автоматизации и игнорирования того факта, что существуют модули для выполнения вычислений, как бы можно было выполнить следующий запрос? Меня интересует, как 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.

Приветствуется любое понимание.


person LittleBobbyTables - Au Revoir    schedule 13.08.2010    source источник
comment
Не возражаете, если я спрошу, почему вы используете calc.exe вместо вычислений в коде?   -  person Tim Robinson    schedule 13.08.2010
comment
Правильный вопрос - мне было любопытно посмотреть, можно ли это сделать. Я согласен, что расчеты можно (и, вероятно, нужно) производить в коде, но пользователям кажется, что очень нравится программа «Калькулятор» для расчета различных скидок.   -  person LittleBobbyTables - Au Revoir    schedule 13.08.2010
comment
Как насчет этого? freevbcode.com/ShowCode.asp?ID=8698   -  person gtrak    schedule 13.08.2010
comment
@Gary - Я видел это раньше и согласен, что это будет работать, но мой вопрос больше с точки зрения автоматизации. Я полностью согласен с тем, что мой вопрос, скорее всего, ужасная идея; Мне просто интересно, учитывая требование, какая часть требования возможна.   -  person LittleBobbyTables - Au Revoir    schedule 13.08.2010


Ответы (4)


Действительно, все, что вам нужно, это какой-нибудь компонент калькулятора, который вы можете вызвать? Похоже, вы пытаетесь сделать ужасный взлом для простой функциональности. Возможно, будет проще написать свой собственный калькулятор на VB6.

person gtrak    schedule 13.08.2010
comment
Да, это можно решить, изменив алгоритм. Однако речь идет об автоматизированном управлении другими программами. - person Im0rtality; 13.08.2010
comment
Я согласен, что это интересный вопрос, но я думаю, что это намного сложнее, чем должно быть для того, чего действительно хочет спрашивающий :-). - person gtrak; 13.08.2010

Нажатие Ctrl + C заставляет калькулятор копировать отображаемое значение в буфер обмена.

(Это неприятно, потому что стирается все, что пользователь мог скопировать в буфер обмена ранее, но вызывать calc.exe для выполнения арифметических операций тоже неприятно.)

person Tim Robinson    schedule 13.08.2010

Я пробовал еще несколько вариантов кода, но, похоже, вы просто не можете прочитать значение Calc.exe даже через API. Однако я ценю любую помощь.

person LittleBobbyTables - Au Revoir    schedule 21.08.2010

Код VB с функцией ExecuteAndReturnHWnd можно найти здесь http://www.vbforums.com/showthread.php?t=144251 (Не очень удобно, но вы можете убить все процессы calc.exe и выполнить свой)

Вам не нужно получать значение при закрытии calc.exe, используйте его при выполнении расчетов.

person Im0rtality    schedule 13.08.2010