3

编辑:为我希望清晰而编辑

有一个具有单个主窗口的 GUI 应用程序。该主窗口的标题栏中有文本;我的任务是检索主窗口标题栏中的文本。

通常,如果用户登录,应用程序启动得很好,我可以使用 PowerShell 通过调用 System.Diagnostic.Process.MainWindowTitle 来获取主窗口的标题,没问题。

但是,当没有用户登录时,我需要获取相同的信息。我打算编写一个脚本或一个小型控制台应用程序,由任务调度程序启动来执行此操作。很奇怪,我知道:我需要在没有用户登录系统时启动此应用程序,并在其唯一主窗口的标题栏中检索文本。

我知道当没有用户登录时,任务调度程序显然仍会尽职尽责地尝试运行脚本或可执行文件。但是,由于没有用户登录,这些预定的可执行文件或脚本将无法访问 Windows GUI 子系统。因此,如果计划任务尝试启动需要绘制窗口的应用程序,那么该窗口将不会被绘制。

这意味着我不能简单地安排一个脚本来启动这个 GUI 应用程序,在磁贴栏中获取文本然后终止应用程序(我不能这样做,因为应用程序永远不会绘制它的主窗口)。

我有一些想法,我希望对它们提出意见(甚至是另一种选择):

  • 最简单但最不可取的是,我会尝试强制用户登录(即使没有实际用户)。这应该加载GUI 子系统并显示主窗口。在获取主窗口标题的文本后,我会再次注销。

  • 在某些时候,应用程序将调用一些 Windows API 请求绘制一个窗口(由于前面提到的缺少GUI 子系统,该窗口不会被绘制)。也许我可以以某种方式捕获这个请求,也许在这个请求中,我可以找到主窗口标题?还是指向内存的指针?某物?

  • 这似乎不太可行,但也许我可以为机器本身建立一个 RDP。我的想法是,例如,当您将 RDP 放入无头服务器时,服务器正在生成它发送回客户端的视觉元素。因此,当建立 RDP 连接时,GUI 子系统应该处于活动状态以绘制需要发回的元素。就我而言,这些元素不会发送到任何地方,但我希望它们仍然会被创建,这样我就可以获取窗口文本。

最后,我想说明我已经尝试过解析二进制字符串的字符串,希望在编译时从存储在二进制文件中的主窗口标题中找到信息。但是,它不够可靠,无法始终如一地使用。

如果有人真的到达了这个墙的结尾,那就太棒了,如果你做到了,谢谢。我会采用任何语言的解决方案,但我最擅长 C++ 和 C#。

4

1 回答 1

1

创建它以便公开解决方案。

事实证明System.Diagnostic.Process.MainWindowTitle并不总是按预期运行。最后,我所要做的就是用 EnumWindows 枚举顶部窗口并使用 GetWindowText 来获取 GUI 应用程序的标题。

我编写了一个控制台应用程序,它完全可以做到这一点,并且控制台应用程序能够启动 GUI 应用程序并获取其主窗口标题。它通过远程 PowerShell 会话以及通过任务计划程序启动时工作。

不确定为什么System.Diagnostic.Process.MainWindowTitle与枚举顶部窗口和使用 GetWindowText 不同,但我猜那是另一次了。

感谢所有伸出援助之手的人。

于 2013-06-06T16:27:22.723 回答