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

问题描述 投票:0回答:3

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

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

考虑下面的屏幕截图:

用户已从行02、列17到行0266中选择文本。

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

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

using AutOIATypeLibrary;
using AutPSTypeLibrary;

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

c# com mainframe ibm-pcomm
3个回答
1
投票

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

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

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

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

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

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


0
投票

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


-1
投票

espero poder ajudar com uma função que montei no .net em C# para pesquisar algumas informações na tela do PCOMM:

        try
        {
            bool retor = true;
            // instancia as bibliotecas que conectão ao pcomm
            var n_pcomm = new AutConnListTypeLibrary.AutConnList(); 
            var pcomm = new AutPSTypeLibrary.AutPS();               


            // checa se tem algum pecom aberto
            n_pcomm.Refresh();
            if (n_pcomm.Count == 0)
            {   
                // abre caso o pcomm que não está aberto 
                Process.Start(@"C:\ProgramData\IBM\Personal Communications\3270.ws");
                Thread.Sleep(10000);
                // volta a checar o pcomm aberto
                n_pcomm.Refresh();
            }


            //Verifica qual pecom está aberto
            for (int i = 1; i <= n_pcomm.Count; i++)
            {
                string aplicacao = n_pcomm[i].ConnType.ToString();
                string sessao = n_pcomm[i].name.ToString();

                if (aplicacao == "DISP3270")
                {   
                    // conect ao pecomm aberto
                    pcomm.SetConnectionByName(sessao);
                    //return;
                }
            }

            /*  ------------------------------------------------------------------
             *  inicia os comandos de incerção e extração de informação
             *  mais comus:
             *  SendKeys = para inserir informações
             *  GetText = para pegar informação                   
             *  -------------------------------------------------------------------
            */
            
            // retorna para primeira pagina da aplicação
            pcomm.SendKeys("[pF9]");
            pcomm.Wait(1000);
            pcomm.SendKeys("[pF3]");
            pcomm.Wait(1000);
            pcomm.SendKeys("[Enter]");
            pcomm.Wait(1000);
            retor = pcomm.WaitForString("COMMAND", 23, 2, 3000, true, true);
            if(retor == false)
            {
                return;
            }
            

            // vai para a seção que eu preciso para fazer a consulta
            pcomm.SendKeys("1", 23, 14);
            pcomm.SendKeys("[Enter]");
            pcomm.Wait(1000);
            pcomm.SendKeys("S6ca");
            pcomm.SendKeys("[Enter]");
            pcomm.Wait(1000);
            pcomm.SendKeys("21", 3, 37);
            pcomm.SendKeys("1200",3,52);
            pcomm.SendKeys("D", 3, 79);
            pcomm.SendKeys("3", 5, 5);
            pcomm.SendKeys("[Enter]");                
            retor = pcomm.WaitForString("S6CB", 1, 2, 3000, true, true);
            if (retor == false)
            {
                return;
            }
            pcomm.SendKeys(lb_TextBox1.Text, 3, 51);
            pcomm.SendKeys(lb_TextBox2.Text, 3, 54);
            pcomm.SendKeys(lb_TextBox3.Text, 3, 70);
            pcomm.SendKeys("1", 5, 4);
            pcomm.SendKeys("1", 21, 2);                
            pcomm.SendKeys("[Enter]");
            retor = pcomm.WaitForString("S6AO", 1, 2, 3000, true, true);
            if (retor == false)
            {
                return;
            }
            pcomm.SendKeys("1", 5, 2);
            pcomm.SendKeys("[Enter]");
            retor = pcomm.WaitForString("S6AQ", 1, 2, 3000, true, true);
            if (retor == false)
            {
                return;
            }

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {

                if (row.Cells[0].Value != null)
                {
                    string pedido = row.Cells[0].Value.ToString();
                    string desm = row.Cells[1].Value.ToString();
                    pcomm.SendKeys(pedido, 6, 10);
                    pcomm.SendKeys(desm, 6, 20);
                    pcomm.SendKeys("[Enter]");

                    if(pcomm.WaitForString(pedido, 7, 10, 3000, true, true))
                    {
                        row.Cells[2].Value = pcomm.GetText(10,10, 10).Trim();
                        row.Cells[3].Value = pcomm.GetText(9,74,5).Trim();
                        row.Cells[4].Value = pcomm.GetText(9, 60, 10).Trim();
                        dataGridView1.Refresh();
                    
                    }

                }
            }

        }   
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }
© www.soinside.com 2019 - 2024. All rights reserved.