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
}
Czy masz obsługę panelu 2? – besworland
Jak już powiedziałem. Tak. – David
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