【问题标题】:Window CE 4.2 - Enumerating through the controls of a different running processWindows CE 4.2 - 通过不同运行进程的控件进行枚举
【发布时间】:2014-10-18 16:45:39
【问题描述】:

我负责在 Windows CE 4.2 中将数据从 COM 1 发送到 COM 2。正在运行的应用程序从 COM 1 获取数据并以表单(我假设为文本框)的形式向用户显示。然后我必须获取该数据并将其发送到 COM 2。显示数据的程序正在使用 COM 1,我不知道如何劫持 COM 1。

我认为下一步是尝试做一个屏幕报废。不幸的是,这是一个紧凑的框架和旧版本,从大量研究来看,托管代码似乎是不可能的。我将使用的许多 API 函数都不可用;以 FindWindowEx 为例。

这就是我现在的位置。我创建了两个项目。一个运行一个文本框和一些措辞。一个单独的应用程序运行并尝试读取该 TextBox 中的文本。我已经能够使用 FindWindow API 根据表单的名称找到正在运行的进程。使用我在这个网站上找到的代码,我什至能够通过表单的控件进行枚举。但是,我的 TextBox 从未找到,并且许多已找到的控件从未由我自己放置在表单上(列表框、按钮)。我认为这些是表单的初始控件。

有人有这方面的经验吗?目前这是在 C# 中,但 VB 或 Visual C++ 会很好。即使您对第三方应用程序有任何想法。顺便说一句,我没有选择升级到更高版本的紧凑框架。

谢谢。

我刚刚发现的一个更新。它看起来不像我只筛选新数据,而是必须筛选整个屏幕并将其发送到 COM2。有人会扫描条形码,我会通过 COM2 发送所有屏幕数据。数据可能包括图片等。

【问题讨论】:

  • 当前使用 COM1 的现有应用程序是否能够将其配置为使用不同的 COM 端口,或者是否硬编码为 COM1?
  • TE2000 确实提供了更改 COM 端口的功能,但在这种情况下,这是硬件要求。

标签: c# vb.net winapi compact-framework windows-ce


【解决方案1】:

对于本机 C 应用程序,我有一个 sceleton 枚举对话框内的所有子窗口和控件:http://code.google.com/p/rdp-auto-login/source/browse/trunk/rdp-auto-login/tscDialog.cpp。请参阅 ScanTSCWindow 以及在“TSC 对话框元素”注释中找到的结果。

我从远程间谍开始,并通过 RDM 窗口查找 CtrlID 值。还有一个名为 zDump (http://www.hjgode.de/wp/2009/06/11/zdump-take-a-look-inside-windows-ce/) 的好工具,它可以在设备上运行,让您能够查看窗口元素。

理论上,Windows(移动设备或桌面)中的每个元素都是一个窗口。通过那里的窗口句柄可以访问窗口。句柄由操作系统在 CreateWindow/Ex 期间分配。在对话框内部,元素可以通过控件 ID(资源值)、窗口类(即“EDIT”、“LISTBOX”)和窗口文本以及在内部由创建时的窗口句柄来标识。

Compact Framework 应用程序的问题在于它们隐藏了许多这些基础知识,并且对话框 (Form) 元素无法从其他进程中轻松识别。

正如您所说,您无法捕获 COM1,如果您停止应用程序然后打开 COM1,那是什么?众所周知,通常一个应用程序可以同时访问一个串行端口。然后您可以直接读取串行数据而无需访问外部窗口。 还有一些驱动程序可以启用端口镜像或多路访问。即使是基于 Windows CE 的操作系统(即http://www.virtual-serial-port.org/products/serial-splitter-mobile/)。

如果应用程序是一个紧凑的框架,您可以使用 .Net Reflector 或类似的 .Net 反编译器查看代码内部。我经常用它来模仿或学习其他应用程序。

您说“我负责在 Windows CE 4.2 中将数据从 COM 1 发送到 COM 2 的任务。正在运行的应用程序从 COM 1 获取数据并以表单(我假设为文本框)的形式显示给用户。然后我必须获取该数据并将其发送到 COM 2。COM 1 正在被显示数据的程序使用,我不知道如何劫持 COM 1。如果你不启动其他应用程序,你可以编写自己的,不需要解析外国应用程序。

您可能可以发布其他应用程序或更详细的信息,说明它做了哪些您不能做的事情。

编辑/更新:

我们现在知道它是 Intermec TE2000(终端仿真),答案是使用 TE2000 提供的 XMLRPC 接口。该接口能够回调由 xmlrpc 服务器托管的函数,并在屏幕更改时发送所有屏幕内容(文本、字段和属性)。我有为此工作的 c++ stl windowsce 代码。 如果设备通过网络连接,xmlrpc服务器甚至可以在PC上运行。

由于 TE2000 确实使用原生 drwastring API,您将无法成功从窗口读取文本。如果您截屏窗口,则必须对图像进行 OCR。 XMLRPC 确实避免了这一切。

UPDATE2

我完成了一个类库以使用 TE2000 xmlrpc 获取异步屏幕更新:请参阅 https://github.com/hjgode/ITE_xml_rpc/tree/master/XmlRpcCS/XmlRpcCFhttp://community.intermec.com/t5/Thin-Client-Based-Development/Printing-CV60-Screen-Windows-CE-4-2/m-p/28663/highlight/false#M473

【讨论】:

  • 非常感谢您的回复约瑟夫。我会调查你提到的一切。
  • 我无法控制使用 COM1 的程序(终端仿真器),它必须始终运行。如果串行分离器按我希望的方式工作,那么它肯定是可行的方法。我创建了两个应用程序只是为了测试目的,看看我是否可以使用旧的紧凑框架来枚举控件。在最终产品中,我必须在终端仿真器运行时(并使用 COM 1)读取 COM 1,或者在屏幕上抓取它以获取任何新数据并将其发送到 COM 2。
  • 终端模拟器是用.NET写的吗?如果是这样,请使用反射器应用程序查看内部。如果它是一个原生应用程序和一个真正的终端模拟器,你可能没有机会找到该领域的控件。 TE 应用程序通常只显示文本而不使用任何 Windows 控件。 - 你能发布截图吗?或命名 TE 应用程序?
  • 抱歉,josef 回复晚了。它是Intermec 的TE2000-5250 仿真器。我不相信它是用 .NET 编码的。这是我用来捕获该过程的实际代码行: IntPtr hwnd = FindWindow("fwpcv6h0", null);抱歉,我没有应用程序的屏幕截图。
  • 好的,我知道那个应用程序。它是用 C/C++ 编写的。我将查看应用程序窗口,看看是否可以从外部进程读取它。
猜你喜欢
  • 2012-05-19
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多