首页 > 解决方案 > IBM PCOMM Emulator,通过 COM/C# 接口访问选定文本

问题描述

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

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

考虑下面的屏幕截图: 在此处输入图像描述

用户已从第02行第17列到第02行第66列中选择了文本。

但是光标(我可以通过 API 访问)位于 Row 15 Column 26

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

using AutOIATypeLibrary;
using AutPSTypeLibrary;

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

标签: c#commainframeibm-pcomm

解决方案


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

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

“蛮力”方法需要询问屏幕上的对象堆栈以找到 PCOMM 绘制的矩形以显示文本选择。使用标准的 Windows API 调用,您可以获得它的属性,包括相对于窗口的屏幕坐标。当然,问题在于这是以像素为单位的,而不是 3270 个字符,因此您需要了解字体度量和所有这些东西才能了解 (98, 123) 的像素 XY 实际上是第 2 行第 16 列3270显示器。这是可能的,但您需要具备一定的 Windows 编程技能。

方法二是我很久以前在类似情况下使用的方法,它依赖于 PCOMM 突出显示该区域以允许剪切和粘贴等操作。您在代码中要做的就是编写一些内容,将 Windows“COPY”命令发送到 PCOMM 应用程序,然后您可以读取从剪贴板上捕获的内容。不能保证 100% 工作,但肯定会比“蛮力”方法容易得多。

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

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


推荐阅读