2012-08-12 3 views
0

기본 타사 WinForms 응용 프로그램을 자동화하는 데 도움이되는 작은 도구를 만들어야합니다.타사 WinForms 프로세스에서 ToolStripStatusLabel 찾기

지금까지 나는 많은 장애물을 극복 할 수 있었지만이 중 하나는 가장 좌절스러운 것입니다. (그리고 8 시간 동안 LVM_GETITEMTEXT가 LVITEM 구조체를 64 비트 포인터로 반환하는 것을 조사하는 데에만 소비했습니다. 매우 실망 스럽습니다.) - 타사 응용 프로그램의 StatusStrip에서 ToolStrupStatusLabel에 대한 참조를 얻는 방법을 찾지 못했습니다.

응용 프로그램이 끝나면 StatusStrip이 끝났음을 나타내도록 업데이트되었을 때만 작업이 할당되었음을 나타냅니다. 한 작업이 끝나고 다른 작업으로 넘어갈 때를 찾지 못하면 안정적으로 작업을 자동화 할 수 없습니다.

응용 프로그램에 SendMessage()를 보낼 수있는 메시지가 있습니까? 내가 부를 수있는 함수는 무엇입니까? 응용 프로그램의 상태에 대한 통찰력을 얻을 수 있도록이 레이블의 텍스트를 찾는 데 도움이되는 것이 있습니까?

자동화 도구는 다양한 Windows 기능의 pInvoke를 사용하여 C#/Winforms에 프로그래밍됩니다. 또한 LVITEM 구조체에서 데이터를 얻는 것을 돕기 위해 C++에서 자체 DLL을 만들었으므로 C++ 해결 방법도 가능합니다.

답변

2

이것은 작동하지 않습니다. ToolStripItem 파생 클래스는 특수하므로 Control에서 파생되지 않습니다. 그들은 창 핸들이 없으며, 호스트의 창을 사용하여 스스로를 그립니다. 호스트가 ToolStrip 또는 StatusStrip 같은 컨트롤 인 경우

이렇게하면 창 핸들이 필요한 기존 UI 자동화 도구에서 사용할 수 없게됩니다. 이를 제어하는 ​​유일한 방법은 리플렉션을 사용하여 ToolStripItem 참조를 가져 오는 DLL을 삽입하는 것입니다. 존재하는이 Managed Spy++ tool이 기술을 사용합니다. 자신 만의 정보를 넣을 수 있도록 소스 코드가 제공되므로 무거운 짐을지는 ManagedSpyLib를 활용하고 싶을 것입니다.

+0

불행히도이 도구가 작동하지 않는 .NET 프레임 워크 (.NET 4.5)를 사용하고 있기 때문에이 기능이 작동하지 않는 것처럼 보이므로 실습에서 쉽게 볼 수 없습니다. C# 또는 C++에서 Items 속성에 대한 포인터를 얻은 다음 컨테이너에 대한 포인터를 가져온 다음 컨테이너의 첫 번째 인덱스에있는 개체에 대한 포인터를 가져 오는 방법이 있습니까? 내가 이해하는 바로는 StatusStrip-> Items-> Container [0] .Text - 스트립의 핸들만으로 무엇이든 얻을 수 있습니까? –

+0

예, 3.5 이하를 타겟팅해야합니다. 당신이 정말로 4.5에서 작동하도록 만들 필요가 있다면 당신 자신에 달려 있습니다. 그리고 아니요, out-of-process 관리 오브젝트에 대한 안정적인 포인터를 얻는 방법은 없습니다. 그건 기본적으로 가비지 컬렉터와 호환되지 않습니다. –

+0

C# 또는 C++에서 Items 속성에 대한 포인터를 얻고 컨테이너에 대한 포인터를 얻은 다음 컨테이너의 첫 번째 인덱스에있는 개체에 대한 포인터를 가져 오는 방법이 없습니까? 내가 이해하는 바로는 StatusStrip-> Items-> Container [0] .Text - 스트립의 핸들만으로 무엇이든 얻을 수 있습니까? –

관련 문제