修改
为了澄清,没有意图将其投入生产。纯粹从编码/自动化的角度来看,并且忽略了存在用于进行计算的模块的事实,如何处理以下请求?我对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.exe实例关闭时,返回Calc中的值会很好,但是我可以使用按钮来检索值。
在.NET中可能有更好的方法,但我暂时还没有进入VB6。
非常感谢任何见解。
答案 0 :(得分:4)
真的,您只需要一些可以调用的计算器组件吗?好像你正试图为一个简单的功能做一个糟糕的黑客攻击。在VB6中编写自己的计算器可能更容易。
答案 1 :(得分:2)
按Ctrl + C会使计算器将显示的值复制到剪贴板。
(这并不令人愉快,因为它会删除用户之前可能已经复制到剪贴板的任何内容,但调用calc.exe
进行算术运算也不愉快。)
答案 2 :(得分:1)
我已经尝试了一些代码变体,但看起来你甚至无法通过API读取Calc.exe的值。不过,我感谢所有的帮助。
答案 3 :(得分:0)
带有函数ExecuteAndReturnHWnd
的VB代码可以在http://www.vbforums.com/showthread.php?t=144251找到(用户不太友好,但你可以杀死所有的calc.exe进程并执行你的进程)
您不必在calc.exe关闭时检索值,在完成计算时将其取出。