所以基本上我有这个以列表形式输出数据的软件。感谢这里的评论,我们了解到它很可能是用 .NET 编写的。
我想扫描列表,这样我就可以对数据做一些算法。
使用 Spy++,我发现保存此列表的标题为“Panel2”,我可以使用 EnumChildWindows 获取此列表的句柄(其类为“WindowsForms10.Window.8.app”)。
但是我不知道如何进入列表本身,所以我可以阅读它的项目。我已经在“Panel2”句柄上尝试了 EnumChildWindows 并输出了所有这些窗口的标题,但它们都是空的。
panel2 可以是实际列表吗?如果是这样,我可以将其转换为 (CListCtrl*) 吗?
Axilles 在评论中提到它可能是用 .NET 编写的,是否可以使用http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1之类的东西来获取列表的 controlID / 句柄?
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
}