Поиск ToolStripStatusLabel в стороннем процессе WinForms
Меня попросили создать небольшой инструмент, помогающий автоматизировать простое стороннее приложение WinForms.
До сих пор мне удалось преодолеть множество препятствий, но это одно из самых разочаровывающих из них (и потратить 8 часов на исследование, чтобы выяснить, LVM_GETITEMTEXT возвращал структуру LVITEM с 64-битными указателями, было очень сложно) - Я не могу найти какой-либо способ получить какую-либо ссылку на ToolStrupStatusLabel в StatusStrip стороннего приложения.
Единственный признак того, что приложение завершило назначенную ему задачу, - это когда StatusStrip обновляется, чтобы показать, что оно завершено. Я не могу надежно автоматизировать его работу, если не могу узнать, когда он заканчивает одну работу и переходит к другой.
Есть ли какое-нибудь сообщение, которое я могу отправить в приложение ()? Любая функция, которую я могу вызвать? Что-нибудь, что поможет мне найти текст на этом ярлыке, чтобы я мог получить представление о состоянии приложения?
Инструмент автоматизации запрограммирован в C#/Winforms с pInvoke для различных функций Windows. Я также создал свою собственную DLL на C++, чтобы помочь с получением данных из структуры LVITEM, так что обходные пути C++ также возможны.
1 ответ
Это не сработает. Производные классы ToolStripItem являются специальными, они не наследуются от Control. У них нет своего собственного дескриптора окна, они используют окно своего хоста, чтобы нарисовать себя. Где хост является элементом управления, таким как ToolStrip или StatusStrip в вашем случае.
Это делает их непригодными для использования с традиционными инструментами автоматизации пользовательского интерфейса, для которых требуется дескриптор окна. Единственный способ управлять ими - ввести DLL, которая использует отражение, чтобы получить ссылку на ToolStripItem. Это существует, инструмент Managed Spy++ использует эту технику. Исходный код предоставлен, так что вы можете собрать свой собственный, вы захотите использовать ManagedSpyLib, который делает тяжелую работу.