使用winapi或mfc从.NET应用程序列表控件中获取项目名称

Dav*_*vid 5 c++ winapi mfc

所以基本上我有这个软件以列表形式输出数据.感谢这里的评论我们已经明白它最有可能用.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

}
Run Code Online (Sandbox Code Playgroud)

Jos*_*man 6

间谍++是一个很好的工具,但它不是.Net意识到的.我建议在应用程序上尝试UISpy.exe,看它能找到比Spy ++更多的元素.UISpy.exe可以在http://msdn.microsoft.com/en-us/library/ms727247.aspx找到,还有ManagedSpy.exe以及http://msdn.microsoft.com/en-us/magazine/ cc163617.aspx

您可以通过附加调试器来确定应用程序是否是.Net应用程序(Visual Studio或WinDBG;如果您还没有Visual Studio,我建议使用VC++的免费版本,因为我不是确保C#版本具有本机调试支持).另一种选择是利用Windows平台SDK中的depends.exe,甚至只是来自http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx的 ProcessExplorer.exe 来查看加载到进程中的DLL(即一个.Net应用程序将加载核心.Net DLL).

如果列表实际上是Windows Presentation Forms(WPF)列表,您可能必须使用.Net UIAutomation类来访问列表的内容.UIAutomation在此处记录:http: //msdn.microsoft.com/en-us/library/ms747327.aspx

编辑:根据MSDN文档,UISpy.exe现已过时:

注意Accessible Explorer和UI Spy工具已过时且不再可用.开发人员应该使用Inspect或AccScope.