如何使 SendKeys 在 IBM Host Access Library 中同步动作

2024-04-14

我用用于 COM 自动化的 IBM 主机访问类库 https://www-01.ibm.com/support/knowledgecenter/SSEQ5Y_6.0.0/com.ibm.pcomm.doc/books/html/host_access08.htm?lang=en作为通过终端仿真器与 IBM AS400(又名 iSeries、IBM i、绿屏、5250)进行通信的一种方式。我注意到,当您发出“SendKeys”指令时,控制权会在 IBM 模拟器完成该命令之前返回到您的应用程序。这可能会导致计时问题,因为您可能会在系统准备好接受之前发送另一个“SendKeys”指令。

例如:

Imports AutPSTypeLibrary
Imports AutConnListTypeLibrary
Imports AutSessTypeLibrary

Sub Example
    Dim connections As New AutConnList
    connections.Refresh()
    If connections.Count < 1 Then Throw New InvalidOperationException("No AS400 screen can currently be found.")
    Dim connection As IAutConnInfo = DirectCast(connections(1), IAutConnInfo)

    _Session = New AutSess2
    _Session.SetConnectionByHandle(connection.Handle)
    Dim _Presentation As AutPS = DirectCast(_Session.autECLPS, AutPS)
    _Presentation.SendKeys("PM70[enter]", 22, 8)
    _Presentation.SendKeys("ND71221AD[enter]", 22, 20)

End Sub

在调试器中单步执行代码时可以正常工作,但在正常运行时会失败,因为第二条指令发送得太早。

解决这个问题的一种方法是在每个命令后面放置一个计时器或循环,以减慢调用程序的速度。我认为这不太理想,因为时间长度并不总是可预测的,您通常会等待比需要的时间更长的时间来适应偶尔的打嗝。这会减慢整个过程的运行时间。

解决此问题的另一种方法是等待,直到屏幕上由于发送的命令而出现可测试的条件。这有时会起作用,但某些命令不会导致屏幕更改进行测试,如果您希望将命令调用抽象到类或子例程中,则必须传递要监视的屏幕条件。

我想找到一种适用于一般情况的“等待”方法。像 autECLScreenDesc 类这样的选项似乎必须根据非常具体的条件进行定制。

autECLPS(又名 AutPS)类有许多 Wait 方法(等待,WaitForCursor,WaitWhileCursor,WaitForString,WaitWhileString,WaitForStringInRect,WaitWhileStringInRect,WaitForAttrib,WaitWhileAttrib,WaitForScreen,WaitWhileScreen)但它们似乎也在等待特定的条件,不适用于一般情况。一般情况对我来说很重要,因为我实际上正在尝试编写一个通用字段更新子例程,可以从 .dll 内部和外部的许多地方调用该子例程。

这个例子是用 VB.NET 编写的,但我希望 C#、C++、VB6、Java 也能有同样的行为;任何使用 IBM 的产品Windows 个人通信,版本 6.0 主机访问类库。 https://www-01.ibm.com/support/knowledgecenter/SSEQ5Y_6.0.0/com.ibm.pcomm.doc/books/html/host_access.htm?lang=en


“操作员信息区”类似乎为这个问题提供了解决方案。

我的一般情况似乎可以正常使用此实现:

 Friend Sub PutTextWithEnter(ByVal field As FieldDefinition, ByVal value As String)
    If IsNothing(field) Then Throw New ArgumentNullException("field")
    If IsNothing(value) Then Throw New ArgumentNullException("value")
    _Presentation.SendKeys(Mid(value.Trim, 1, field.Length).PadRight(field.Length) & "[enter]", field.Row, field.Column)
    WaitForEmulator(_Session.Handle)
End Sub

Private Sub WaitForEmulator(ByVal EmulatorHandle As Integer)
    Dim Oia As New AutOIATypeLibrary.AutOIA
    Oia.SetConnectionByHandle(EmulatorHandle)
    Oia.WaitForInputReady()
    Oia.WaitForAppAvailable()
End Sub

我感谢一位名为“khieyzer”的用户这个留言板 http://www.utteraccess.com/forum/index.php?showtopic=2028886感谢您指出我们这个干净且通用的解决方案。

Edit:

经过几周的调试并解决时序和资源释放问题后,该方法现在如下所示:

Private Sub WaitForEmulator(ByRef NeededReset As Boolean)
    Dim Oia As New AutOIA
    Oia.SetConnectionByHandle(_Presentation.Handle)

    Dim inhibit As InhibitReason = Oia.InputInhibited
    If inhibit = InhibitReason.pcOtherInhibit Then
        _Presentation.SendKeys("[reset]")
        NeededReset = True
        WaitForEmulator(NeededReset)
        Marshal.ReleaseComObject(Oia)
        Exit Sub
    End If

    If Not Oia.WaitForInputReady(6000) Then
        If Oia.InputInhibited = InhibitReason.pcOtherInhibit Then
            _Presentation.SendKeys("[reset]")
            NeededReset = True
            WaitForEmulator(NeededReset)
            Marshal.ReleaseComObject(Oia)
            Exit Sub
        Else
            Marshal.ReleaseComObject(Oia)
            Throw New InvalidOperationException("The system has stopped responding.")
        End If
    End If

    Oia.WaitForInputReady()
    Oia.WaitForAppAvailable()
    Marshal.ReleaseComObject(Oia)
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 SendKeys 在 IBM Host Access Library 中同步动作 的相关文章

  • 选项卡索引不适用于面板中的控件?

    我有一个 vb net Windows 窗体 其中包含大约 15 个组合框和 15 个文本框 以及其他几个控件 所有这些TextBoxes and ComboBoxes位于面板中 原因是我需要根据用户选择 输入的内容来调整控件的可见属性 因
  • VB.NET vNext 中的迭代器以及 C# 中迭代​​器的限制

    我刚刚在上看到异步CTP网站 http msdn microsoft com en us vstudio async aspxVB NET 的下一个版本将有迭代器 我猜它们包含了迭代器 因为重写过程与新的迭代器所使用的过程类似 async
  • VB无法访问不同项目中的类,相同的解决方案

    我正在使用 VB for Visual Studio 工作 并且项目中有一个类需要将变量声明为另一个项目中的类 对于可视化 解决方案 A 包含 Project1 和 Project2 在 Project1 的类中 我需要声明一个变量作为 P
  • ODP.Net - OracleDataReader.读取速度非常慢

    我在 ODP Net 中的 OracleDataReader 方面遇到很多麻烦 基本上 我有一个参数化查询 需要 1 5 秒的时间来运行 返回大约 450 条记录 然后需要 60 90 秒的时间来循环 甚至没有代码在循环中运行 实际上是迭代
  • 以编程方式确定是否安装了 COM 库 (.DLL)

    C 中是否有一种编程方式来确定是否已安装特定的 COM DLL 或者这是扫描注册表中的 classId 的问题 我通常所做的 如果我再次需要的话也会这样做 是尝试创建一个您知道位于 COM 库中的类的对象实例 通过 ProgID 或 GUI
  • 在 Delphi 中将对象转换为 OleVariant

    有没有办法在 OleVariant 中传递包装并解开 TObject 后代 我正在尝试跨自动化对象传递 TObject 我知道这不是一个好主意 但我没有更好的选择 该对象将在来自同一自动化 dll 的对象之间传递 如果这有什么区别的话 像这
  • 在 vb.net 中添加记录并使用 elseif 检查记录是否存在

    我是 vb net 的新手 提前抱歉 谁能帮我看看我的 elseif 代码行有什么问题吗 Dim con As SqlConnection New SqlConnection Data Source PC11 PC kim Initial
  • VB.NET - 有没有办法在委托中使用可选参数? (或者计划允许这样做?)

    据我了解 在 VS2008 附带的 VB 版本中 委托中不可能有可选参数 但是 我想知道将来是否有任何解决方法或计划将此功能合并到 VB NET 中 我想做的事 Public Delegate Function Deserializer O
  • 非 Web 项目的 XML 序列化程序集

    我正在尝试解决 VS 2010 VB NET 和 C 中自动生成序列化程序集的众所周知的问题 项目设置中的 生成序列化程序集 选项对于非 Web 项目没有任何作用 请参阅http blog devstone com aaron archiv
  • 从文件资源管理器打开我的应用程序中的文件

    我在 VB NET 中创建了自己的应用程序 该应用程序将其文档保存到具有自己的自定义扩展名 eds 的文件中 假设我已将文件扩展名与我的应用程序正确关联 那么当我在文件资源管理器中双击该文件时 如何实际处理应用程序中所选文件的处理 我是在
  • 如何使用网络浏览器控件填写 html 表单

    在VB6 classic中 我们可以这样做 Private Sub Form Load WebBrowser1 Navigate2 http yourSite com End Sub Private Sub Command1 Click W
  • 如何在 vb.Net 中设置默认表单?

    如何将第四个表单设置为在 Visual Studio 2008 中按 f5 时将运行的默认表单 因为表单 1 始终是第一个启动的 在解决方案资源管理器中右键单击您的项目 选择属性 选择应用程序选项卡 从 启动表单 下的下拉列表中选择您的表单
  • WPF DataGrid 显示点而不是逗号

    在网上查找并寻找答案后没有结果 我想向您寻求帮助 我有一个包含 2 列的 SQL 数据库表 浮点数据类型 例如 1 2 1 3 1 4 等 绑定到一个DataGrid XAML 代码
  • 使用 pywin32com 进行 opc 的内存泄漏

    我很难弄清楚如何解决内存泄漏问题 我认为这可能是 pywin32 的问题 但我不完全确定 我用于读取 写入单个项目的代码似乎工作得很好 但是当使用组函数时 它会慢慢泄漏内存 我怀疑这是来自必须在 server handles 中传递的基于
  • 如何将IDL导入到Delphi中?

    我如何导入接口定义语言 idl 文件存入Delphi 将类型和接口转换为 pascal 文件 我试过了 File Open 它只显示 idl 文本文件的文本 Project 添加到项目 它只是 就像 添加了一个 idl文本文件到项目 成分
  • 如何使用 VB.NET 或 C#.NET 代码从 yahoo 邮件 ID 发送邮件

    我想从我的 yahoomail Id 发送邮件 如何使用 VB NET 或 C NET 代码从 yahoo mail Id 发送邮件 需要善意的帮助 提前谢谢 西瓦库马尔 以下是一些制作基本 html 电子邮件消息的示例 http help
  • VB.Net 中的文件比较

    我需要知道两个文件是否相同 起初我比较了文件大小和创建时间戳 但这不够可靠 我想出了下面的代码 似乎可行 但我希望有人有更好 更简单或更快的方法 基本上我正在做的是将文件内容流式传输到字节数组 并通过 System Security Cry
  • 有没有使用 Java 访问 Windows COM 方法的方法?

    我有一个应用程序 它利用 JNA 来调用 C 硬件抽象库中的函数 支持的硬件设备之一需要初始化 Windows COM 子系统 通过 CoInitialize 或 CoInitializeEx 有谁知道有什么 Java 库可以做到这一点吗
  • 从 RichTextBox 复制文本及其格式

    如何将 RichTextBox 中的文本及其格式复制到写字板或网络浏览器 就像复制纯文本一样 您可以使用Clipboard SetText method http msdn microsoft com en us library 6eahs
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows

随机推荐