【问题标题】:Locating a ToolStripStatusLabel in a third party WinForms process在第三方 WinForms 进程中定位 ToolStripStatusLabel
【发布时间】:2012-08-12 13:50:51
【问题描述】:

我被要求创建一个小工具来帮助自动化基本的 3rd 方 WinForms 应用程序。

到目前为止,我已经设法克服了许多障碍,但这是迄今为止最令人沮丧的障碍之一(并且花了 8 小时研究才发现 LVM_GETITEMTEXT 正在返回一个带有 64 位指针的 LVITEM 结构令人沮丧)- 我似乎根本找不到任何方法来获取对第三方应用程序 StatusStrip 中 ToolStrupStatusLabel 的任何类型的引用。

我知道应用程序已完成分配的任务的唯一迹象是 StatusStrip 何时更新以显示它已完成。如果我无法确定它何时完成一项工作并继续进行另一项工作,我就无法可靠地自动化它的操作。

我可以向应用程序 SendMessage() 发送任何消息吗?我可以调用任何函数吗?有什么可以帮助我找到此标签上的文本,以便我深入了解应用程序的状态?

自动化工具在 C#/Winforms 中使用 pInvoke 进行编程,以实现各种 Windows 功能。我还在 C++ 中创建了自己的 DLL,以帮助从 LVITEM 结构中获取数据,因此 C++ 的变通方法也是可能的。

【问题讨论】:

    标签: c# winforms statusstrip toolstripstatuslabel


    【解决方案1】:

    这行不通。 ToolStripItem 派生类是特殊的,它们不是从 Control 派生的。他们没有自己的窗口句柄,他们使用宿主的窗口来绘制自己。主机是控件,例如您的情况下的 ToolStrip 或 StatusStrip。

    这使得它们无法从需要窗口句柄的传统 UI 自动化工具中使用。征服它们的唯一方法是注入一个使用反射来获取 ToolStripItem 引用的 DLL。这是存在的,Managed Spy++ tool 使用了这种技术。提供了源代码,因此您可以将自己的源代码放在一起,您需要利用 ManagedSpyLib 来完成繁重的工作。

    【讨论】:

    • 不幸的是,这似乎不起作用,因为我正在使用该工具无法在 (.NET 4.5) 下运行的 .NET 框架,因此我无法在其中看到它实践。在 C# 或 C++ 中是否没有办法获取指向 Items 属性的指针,然后获取指向容器的指针,然后获取指向容器第一个索引中的对象的指针?据我了解,StatusStrip->Items->Container[0].Text - 是否有可能从条带的手柄中得到任何东西?
    • 是的,您需要定位到 3.5 或更低版本。如果你真的需要让它在 4.5 上工作,你就靠你自己了。不,没有办法在进程外获得指向托管对象的稳定指针。这与垃圾收集器根本不兼容。
    • 在 C# 或 C++ 中是否没有办法获取指向 Items 属性的指针,然后获取指向容器的指针,然后获取指向容器第一个索引中的对象的指针?据我了解,StatusStrip->Items->Container[0].Text - 是否有可能从条带的手柄中得到任何东西?
    • 到那时,我认为您会探索可以任意更改的内部数据结构。正如汉斯所说,ToolStripItem 很特别。您可能能够找到一种方法,但在 .net 的每个版本/位数上可能会有所不同。 ToolStrip 不支持任何标准的 ui 自动化库吗?那会让我有点吃惊。不需要直接窗口句柄来支持 ui 自动化。 WPF,例如
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2012-03-20
    • 2015-01-03
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多