Win32com 与 Reflection Desktop 的接口

Win32com interfacing with Reflection Desktop

我 运行 一些 python 脚本和程序来聚合和编辑 Attachmate Extra 中的数据。直到最近,我的公司还在使用旧版本的 Attachmate Extra。我正在测试新版本 (Reflection Desktop v. 16.2),我的脚本不再有效。我在 上的有用建议的帮助下构建了它们。我希望能够在新版本上控制(抓取、写入等)屏幕。

这是我目前所在的位置。 运行 此代码创建一个新的 window:

system = win32com.client.Dispatch("ReflectionIBM.Session")
system.Visible = True

...但是从那里我无法执行我以前使用的任何命令。 运行这个,比如

system.MoveCursor(11, 65)

在模拟器中创建一个不连接到会话的新选项卡。 我查看了 Reflection 文档以寻找答案。 This page 让我相信旧的会话方法不再需要,但我不确定。我认为我正在包装正确的对象,并且文档说遗留命令仍然有效,但我还没有弄清楚如何 link 它们。

作为参考,以下是我之前用来连接 Attachmate 的线路:

system = win32com.client.Dispatch("EXTRA.System")
sess0 = system.ActiveSession
Screen = sess0.Screen

感谢任何帮助。我一直在 win32com 浏览器中搜索列表命令并查看注册表以查找可用的 类 但我不知道要查找什么。谢谢!

编辑:

我之前使用了几个函数在 Attachmate 中读取、写入和移动光标。示例:

def write(screen,row,col,text):
    screen.row = row
    screen.col = col
    screen.SendKeys(text)

write(screen, 10, 65, "test")

有没有办法让它在反射中再次工作?

我仍然不知道为什么会这样。在 VBA 中,GetObject 方法适用于“反射工作区”,但在 python 中,它没有产生我能找到的任何可用属性。对于 python,要获取活动会话对象,我必须使用 EXTRA.System:

from win32com.client.gencache import EnsureDispatch
screen = EnsureDispatch("EXTRA.System").ActiveSession.Screen

从那里看,代码似乎与 VBA 和

大体相同
screen.GetString(row, col, len)
screen.PutString(data, row, col)
screen.SendKeys('<PF1>')

用于与主机交互。

经过更多文档阅读和反复试验,我解决了它。 “EXTRA.System”因遗留原因而保留,因此技术上仍然有效。但是,要连接到 Reflection 的活动会话,此方法有效:

system = win32com.client.GetObject('Reflection Workspace')

然后获取活动视图:

screen = system.GetObject("Frame").SelectedView.Control.Screen

或特定的编号视图:

screen = system.GetObject("Frame").view(1).Control.Screen

与反射交互的代码也发生了变化,现在看起来像:

screen.GetText(row, col, len)
screen.PutText2(data, row, col)
screen.SendControlKey(ControlKeyCode)

documentation for ControlKeyCode 似乎没有提供控制键的代码。但是,您可以在 Reflection 附带的 Visual Basic 对象浏览器中找到这些定义。在 Reflection 的宏选项卡上,单击 Visual Basic,然后按 F2 并搜索 ControlKeyCode。它们的列表应该显示出来。比如我的显示ControlKey_F1=10.

screen.SendKeys("N")

仍可用于发送单个击键,例如 N 键,但 SendControlKey 似乎已经取代了命令键,例如 Enter、Page Up 和功能键。

在这方面推出了 python 包 py_reflection,

如何开始:

通过 pip 安装包:

py -m pip install py_reflection

运行 包(运行 终端中的以下命令):

python
>>>from py_reflection import app
>>>app.run()

Api 端点及其描述:**所有端点都有一个公共参数 view_idx(整数,可选)。使用此参数在模拟器中的会话之间切换。

/send_keys:使用此端点在模拟器中按键。要传递的参数:text(string), x(integer), y(integer)

/get_text:使用此端点从特定坐标获取文本。要传递的参数:x(整数), y(整数)

/press_key:使用此端点按特殊控制键: 要传递的参数:control_key(字符串全部大写)。可用的控制键:'F1'、'F2'、'F3'、'F4'、'F5'、'F6'、'F7'、'F8','F9','F10','F11','F12','F13','F14','F15','F16', 'F17','F18','F19','TAB','DELETE','LEFT','DOWN','UP','RIGHT','PAGEUP','PAGEDOWN','CLEAR','END','ENTER'

/get_text_coordinates:使用此端点获取模拟器屏幕中文本的坐标。要传递的参数:文本(字符串)、total_row_count(整数,可选)、total_column_count(整数,可选)

/check_text_present:使用此端点检查模拟器屏幕中是否存在给定文本。要传递的参数:文本(字符串)、total_row_count(整数,可选)、total_column_count(整数,可选)

/move_cursor:使用该端点将光标移动到指定坐标。要传递的参数:x(整数), y(整数)

/get_view_count:使用此端点获取在模拟器中打开的会话数。

更多信息请访问 pypi.org