4

编辑

澄清一下,没有将其投入生产的意图。纯粹从编码/自动化的角度来看,并且忽略了有模块可以进行计算的事实,如何处理以下请求?我对 VB6 如何使用 API 与其他程序进行交互很感兴趣。

结束编辑

使用 VB6,我想知道是否可以启动 CALC.EXE,进行一些计算,然后将值发送回表单中的文本框。

以下是我目前正在测试的代码:

蜜蜂:

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.exe 实例关闭时返回 Calc 中的值会很整洁,但我愿意使用按钮来检索值。

在 .NET 中可能有更好的方法,但我暂时被锁定在 VB6 中。

任何见解将不胜感激。

4

4 回答 4

4

真的,您只需要一些可以调用的计算器组件吗?似乎您正试图为一个简单的功能做一个可怕的黑客攻击。在 VB6 中编写自己的计算器可能更容易。

于 2010-08-13T15:55:18.150 回答
2

按 Ctrl+C 会使计算器将显示的值复制到剪贴板。

(这并不令人愉快,因为它会删除用户之前可能复制到剪贴板的任何内容,但调用calc.exe算术也不是令人愉快的。)

于 2010-08-13T16:00:38.640 回答
1

我已经尝试了更多代码变体,但似乎您甚至无法通过 API 读取 Calc.exe 的值。但是,我感谢所有帮助。

于 2010-08-21T02:36:16.620 回答
0

带有函数的 VB 代码ExecuteAndReturnHWnd可以在这里找到http://www.vbforums.com/showthread.php?t=144251(不是非常用户友好,但你可以杀死所有 calc.exe 进程并执行你的)

您不必在 calc.exe 关闭时检索值,在完成计算时获取它。

于 2010-08-13T15:57:51.373 回答