IBM PCOMM 仿真器,通过 COM/C# 接口访问选定的文本

IBM PCOMM Emulator, Accessing Selected Text via COM/C# interface

请耐心等待,因为这个问题有点复杂。

当用户在 IBM 个人通信 (PCOMM) 中选择文本块时 UI,我如何使用代码访问他们选择的文本的属性?

考虑下面的屏幕截图:

用户选择了行02、列17到行02列的文本66

但是光标(我可以通过 API 访问)位于行 1526.

我可以在以下位置访问 .NET/COM 互操作 API:

using AutOIATypeLibrary;
using AutPSTypeLibrary;

如何获取用户选择的详细信息,即 {02,17} 到 {02,66}?

不使用 PCOMM,而是使用 Host On Demand(您也应该获得许可)。 API 基于 Java,更易于导航。

这绝对是一项具有挑战性的任务,但如果您真的、真的需要这样做,也并非不可能。

除非您可以说服 PCOMM 支持团队给您一个 API(或记录一个可能存在但被隐藏的文件),否则您可以通过以下两种方式之一完成您尝试做的事情.

"brute force" 方法需要询问屏幕上的对象堆栈以找到 PCOMM 绘制的用于显示文本选择的矩形。使用标准的 Windows API 调用,您可以获得它的属性,包括相对于 window 的屏幕坐标。当然,问题在于这是以像素为单位,而不是 3270 个字符,因此您需要了解字体规格和所有其他内容才能理解 (98, 123) 的像素 XY 实际上是3270 显示器。这是可能的,但您需要具备一定的 Windows 编程技能。

第二种方法是我很久以前在类似情况下使用的方法,它依赖于 PCOMM 突出显示该区域以允许 cut-and-paste 之类的事情这一事实。您在代码中要做的是编写一些东西,将 Windows "COPY" 命令发送到 PCOMM 应用程序,然后您可以读取从剪贴板捕获的内容。不能保证 100% 有效,但这肯定比 "brute force" 方法容易得多。

最后,这两种方法的混合将是 运行 PCOMM 在一个好的调试器下,看看你是否能找出当用户选择一个区域并将其复制到剪贴板时它使用的内部方法.在某种程度上,它确实在做您需要做的事情:用户选择一个任意区域,然后当他采取其他操作(复制到剪贴板)时,PCOMM 必须将该图形区域映射到带下划线的 3270 个字符。我敢打赌 PCOMM 有实现我的 "brute force" 方法的代码,所有这些代码都捆绑在他们的一个 DLL 中。如果您能弄清楚 PCOMM 调用什么来获取选定区域下的文本,那么您就没有理由不能在自己的代码中调用相同的东西。

如果您想走这些路,好的 Windows 调试器绝对是您的朋友...