2012-11-08 3 views
5

Quindi, in pratica, ho questo software che emette i dati in un modulo elenco. Grazie ai commenti qui abbiamo capito che è molto probabile scritto in .NET.Ottieni i nomi degli elementi da un controllo elenco di applicazioni .NET utilizzando winapi o mfc

Voglio eseguire la scansione dell'elenco in modo da poter eseguire alcuni algoritmi sui dati.

Utilizzando Spy ++ ho scoperto che ciò che contiene questo elenco è intitolato "Panel2" e posso ottenere l'handle di questo (la sua classe è "WindowsForms10.Window.8.app") utilizzando EnumChildWindows.

Tuttavia non so come arrivare alla lista stessa così posso leggere i suoi articoli. Ho provato EnumChildWindows sulla maniglia "Panel2" e l'output della didascalia di tutte quelle finestre, ma sono tutti vuoti.

Il pannello 2 può essere la lista degli attuatori? In tal caso, posso semplicemente lanciarlo su (CListCtrl *)?

Axilles menziona nei commenti che probabilmente è scritto in .NET, sarà possibile ottenere il controlID/handle nell'elenco usando qualcosa come 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

Avete un gestore del Panel2? – besworland

+0

Come ho detto. Sì. – David

+1

Prima di tutto, sembra che la tua app sia scritta in .NET ("causa di" WindowsForms "nel nome della classe). Secondo: per ottenere l'handle della finestra, dovresti chiamare 'FindWindow' o' FindWindowEx', e solo dopo quella chiamata 'EnumChildWindows'. Scusa se capisco la domanda in modo incorretto. – eraxillan

risposta

6

Spy ++ è uno strumento eccellente, ma non è .Net aware. Suggerisco di provare UISpy.exe sull'applicazione per vedere che è in grado di trovare più elementi di Spy ++. UISpy.exe può essere trovato alla http://msdn.microsoft.com/en-us/library/ms727247.aspx e c'è ManagedSpy.exe così http://msdn.microsoft.com/en-us/magazine/cc163617.aspx

si può essere certi se l'applicazione è un'applicazione .NET o no attaccando un debugger a esso (Visual Studio o WinDBG; I' d consiglio la versione gratuita di VC++ se non hai già Visual Studio poiché non sono sicuro che la versione C# abbia il supporto nativo per il debugging). Un'altra opzione consiste nell'utilizzare depends.exe dall'SDK di piattaforma Windows o anche solo ProcessExplorer.exe da http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx per vedere quali DLL vengono caricate nel processo (ad esempio un'app .Net avrà caricato le DLL .Net core).

Se l'elenco è in realtà un elenco di moduli di presentazione di Windows (WPF), è probabile che sia necessario utilizzare le classi di UIAutomation .Net per accedere ai contenuti della lista. UIAutomation è documentato qui: http://msdn.microsoft.com/en-us/library/ms747327.aspx

Edit: UISpy.exe è ormai obsoleto in base alla documentazione MSDN:

Nota L'Explorer accessibile e interfaccia utente Spy strumenti sono obsoleti e non è più disponibile. Gli sviluppatori dovrebbero invece usare Inspect o AccScope.

+0

Grazie per avermi indicato nella giusta direzione! Tuttavia, non riesco ancora ad afferrare i dati. Posso vederlo chiaramente con UI Spy e ho il diritto IUIAutomationElement *. Ecco la mia nuova domanda (!): http://stackoverflow.com/questions/13433563/get-the-value-of-a-ui-item-from-a-iuiautomationelement-pointer – David