2012-11-08 10 views
5

Więc w zasadzie mam to oprogramowanie, które wyprowadza dane w formie listy. Dzięki komentarzom tutaj zrozumieliśmy, że najprawdopodobniej jest napisany w .NET.Pobierz nazwy pozycji z listy kontrolnej aplikacji .NET przy użyciu Winapi lub mfc

Chcę zeskanować listę, aby wykonać pewne algorytmy danych.

Używanie Spy ++ Stwierdziłem, że to, co zawiera tę listę, nosi tytuł "Panel2" i mogę uzyskać do tego uchwyt (jego klasa to "WindowsForms10.Window.8.app") przy użyciu EnumChildWindows.

Jednak nie wiem, jak dostać się na samą listę, więc mogę przeczytać jej pozycje. Próbowałem EnumChildWindows na uchwyt "Panel2" i wypisywanie podpis wszystkich tych okien, ale wszystkie są puste.

Czy panel2 może być listą wykonawczą? Jeśli tak, to po prostu mogę go rzucić (CListCtrl *)?

Axilles wspomina w komentarzach, że prawdopodobnie jest napisany w .NET, czy można uzyskać kontrolkęID/handle na liście używając czegoś takiego jak http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1?

CWnd* mainWindow; 
    CWnd* panel; 
    CListCtrl* list; 



BOOL CALLBACK findWindow(HWND hwnd,LPARAM lParam) 
{ 
    char text[8]; 
    GetWindowText(hwnd,text,8); 

    if(strcmp(text,"Fetcher") == 0) 
    { 
     mainWindow= CWnd::FromHandle(hwnd); 

     return false; 
    } 

    return true; 
} 

BOOL CALLBACK findPanel(HWND hwnd,LPARAM lParam) 
{ 

    char text[7]; 
    GetWindowText(hwnd,text,7); 

    if(strcmp(text,"Panel2") == 0) 
    { 
     panel = CWnd::FromHandle(hwnd); 

     return false; 
    } 

    return true; 
} 


void CAnalyzeDlg::OnBnClickedButton1() 
{ 
    mainWindow = 0; 

    while(mainWindow == 0) 
    { 
    ::EnumWindows(findWindow,0); 
    } 

    mainWindow ->ActivateTopParent(); 

    while(panel == 0) ::EnumChildWindows(mainWindow ->m_hWnd,findPanel,0); 

    CWnd* pointTest = NULL; 

    CString text = ""; 

    int xx = 337; 
    int yy = 95; 

    while(yy < 1024 && (pointTest == NULL || strcmp(text,"") == 0 || strcmp(text,"Panel2") == 0)) 
    { 
     pointTest = mainWindow->ChildWindowFromPoint(CPoint(xx,yy)); 
     yy++; 
     if(pointTest != 0) 
      pointTest->GetWindowTextA(text); 
    } 



    if(strcmp(text,"") != 0) 
     MessageBox(0,text,0); // This never shows 

} 
+0

Czy masz obsługę panelu 2? – besworland

+0

Jak już powiedziałem. Tak. – David

+1

Przede wszystkim wygląda na to, że twoja aplikacja jest napisana w .NET ("przyczyna" WindowsForms "w nazwie klasy). Po drugie - aby uzyskać jego uchwyt okna, powinieneś zadzwonić do 'FindWindow' lub' FindWindowEx', a dopiero potem wywołać 'EnumChildWindows'. Przepraszam, jeśli rozumiem niepoprawne pytanie. – eraxillan

Odpowiedz

6

Szpieg ++ jest doskonałym narzędziem, ale nie jest .Net świadomy. Sugeruję wypróbowanie UISpy.exe w aplikacji, aby zobaczyć, że jest w stanie znaleźć więcej elementów niż Spy ++. UISpy.exe można znaleźć na http://msdn.microsoft.com/en-us/library/ms727247.aspx i jest ManagedSpy.exe także http://msdn.microsoft.com/en-us/magazine/cc163617.aspx

Możesz być pewien, czy aplikacja jest aplikacją .Net lub nie przez dołączenie debuggera do niego (albo Visual Studio lub WinDBG; I” d. polecam darmową wersję VC++, jeśli nie masz już programu Visual Studio, ponieważ nie jestem pewien, czy wersja C# ma natywne wsparcie debugowania). Inną opcją jest użycie pliku depends.exe z zestawu SDK platformy Windows lub nawet ProcessExplorer.exe z poziomu http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx, aby zobaczyć, jakie biblioteki DLL są ładowane do procesu (np. Aplikacja .Net będzie miała załadowane podstawowe biblioteki .Net).

Jeśli lista jest faktycznie listą Windows Presentation Forms (WPF), najprawdopodobniej będziesz musiał użyć klas .NET UIAutomation, aby uzyskać dostęp do zawartości listy. UIAutomation jest udokumentowane tutaj: http://msdn.microsoft.com/en-us/library/ms747327.aspx

Edit: UISpy.exe jest już nieaktualne według docs MSDN:

Uwaga Dostępna Explorer i UI Szpieg narzędzia są przestarzałe i nie jest już dostępna. Programiści powinni zamiast tego używać Inspect lub AccScope.

+0

Dzięki za wskazanie mnie we właściwym kierunku! Jednak nadal nie mogę pobrać danych. Mogę to wyraźnie zobaczyć za pomocą UI Spy i mam prawo IUIAutomationElement *. Oto moje nowe pytanie (!): http://stackoverflow.com/questions/13433563/get-the-value-a-ui-item-from-a-iuiautomationelement-interinter – David

Powiązane problemy