5

だから基本的に私はリスト形式でデータを出力するこのソフトウェアを持っています。ここのコメントのおかげで、.NET で記述されている可能性が高いことがわかりました。

リストをスキャンして、データに対していくつかのアルゴリズムを実行できるようにします。

Spy++ を使用すると、このリストを保持しているものに「Panel2」というタイトルが付けられていることがわかり、EnumChildWindows を使用してこれ (そのクラスは「WindowsForms10.Window.8.app」) へのハンドルを取得できます。

ただし、リスト自体にアクセスする方法がわからないため、そのアイテムを読み取ることができます。「Panel2」ハンドルで EnumChildWindows を試し、これらすべてのウィンドウのキャプションを出力しましたが、すべて空です。

panel2 を実際のリストにすることはできますか? もしそうなら、私はそれを (CListCtrl*) にキャストできますか?

Axilles はコメントで、おそらく .NET で書かれていると述べています

   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

}
4

1 に答える 1

6

Spy++ は優れたツールですが、.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# バージョンがネイティブ デバッグをサポートしていることを確認してください)。もう 1 つのオプションは、Windows プラットフォーム SDK の depends.exe を利用するか、http: //technet.microsoft.com/en-us/sysinternals/bb896653.aspx の ProcessExplorer.exe だけを利用して、どの DLL がプロセスにロードされているかを確認することです (つまり、 .Net アプリにはコア .Net DLL がロードされます)。

リストが実際に Windows プレゼンテーション フォーム (WPF) リストである場合、.Net UIAutomation クラスを使用してリストの内容にアクセスする必要があります。UIAutomation はここに文書化されています: http://msdn.microsoft.com/en-us/library/ms747327.aspx

編集: MSDN ドキュメントによると、UISpy.exe は廃止されました。

注: Accessible Explorer および UI Spy ツールは廃止され、使用できなくなりました。開発者は、代わりに Inspect または AccScope を使用する必要があります。

于 2012-11-11T18:48:21.073 に答える