0

以下に示すウィンドウのテキストフィールドを自動的に検出して入力するアプリケーションを作成したいと思います。

ここに画像の説明を入力してください

(入力するデータがファイルにあると仮定します)。

問題は、アプリケーションがこのテキストフィールドをどのように見つけるかです。

プログラムを介してデスクトップ上のテキストフィールドの場所を見つけることができれば、この仕事をすることができます。

誰かがこのテキストフィールドを見つけるための可能な方法を理解するのを手伝ってもらえますか?

C++でWindowsフォームアプリケーションを使用しています。

アップデート:

私はspy++で遊んだ。
私はspy++を使用して、ウィンドウハンドルを見つけました。興味のあるウィンドウにファインダーを配置しました。16進値でハンドルを指定します:00080086(実際にはテスト目的で、ファインダーツールをVisual Studioの新しいプロジェクトページに配置しました)。この16進値を意味のあるウィンドウ名に解釈するにはどうすればよいですか?

下の図を参照してください。「name」フィールドの下の「Entername」というテキストフィールドに到達するための次のステップは何ですか。

****サンプルコードは高く評価されます。**

私は、必ずしも私がこれをどのように行っているかではなく、どんな解決策にもオープンです。

ここに画像の説明を入力してください

4

3 に答える 3

2

1 つの解決策は、 Microsoft UI オートメーションテクノロジを使用することです。Vista 以降、Windows に標準で付属しています。.NET からだけでなく、COM を使用して C++ からも使用できます。

以下は、現在デスクトップ ウィンドウの中央にあるUI オートメーション要素のクラス名を毎秒表示する短い C++ コンソール アプリケーションの例です(実行して表示内容を確認できます)。

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);
    IUIAutomation *pAutomation; // requires Uiautomation.h
    HRESULT hr = CoCreateInstance(__uuidof(CUIAutomation), NULL, CLSCTX_INPROC_SERVER, __uuidof(IUIAutomation), (LPVOID *)&pAutomation);
    if (SUCCEEDED(hr))
    {
        RECT rc;
        GetWindowRect(GetDesktopWindow(), &rc);
        POINT center;
        center.x = (rc.right - rc.left) / 2;
        center.y = (rc.bottom - rc.top) / 2;
        printf("center x:%i y:%i'\n", center.x, center.y);
        do
        {
            IUIAutomationElement *pElement;
            hr = pAutomation->ElementFromPoint(center, &pElement);
            if (SUCCEEDED(hr))
            {
                BSTR str;
                hr = pElement->get_CurrentClassName(&str);
                if (SUCCEEDED(hr))
                {
                    printf("element name:'%S'\n", str);
                    ::SysFreeString(str);
                }
                pElement->Release();
            }
            Sleep(1000);
        }
        while(TRUE);
        pAutomation->Release();
    }

    CoUninitialize();
    return 0;
}

このサンプルからできることは、自動化するアプリケーションを起動し、サンプルがそれを検出するかどうかを確認することです (検出する必要があります)。

UISpy ツールを使用して、ターゲット アプリで自動化できるものの完全なツリーを表示することもできます。このターゲット アプリのウィンドウとその他の要素 (テキスト フィールド) が表示され、コンソール アプリケーションの例によって表示される要素が表示されます。

pElementサンプルで発見されたものから、FindFirstを適切な条件 (クラス名、名前、コントロール タイプなど) で呼び出して、テキスト フィールドに到達できます。このテキスト フィールドから、使用可能なUI オートメーション パターンの 1 つ(おそらく TextPattern または ValuePattern) を使用して、テキスト自体を取得または設定します。

すばらしいことに、UISpy ツールを使用して、実際にコーディングする前に、これらすべてが可能かどうかを確認できます。

于 2012-06-20T12:37:12.910 に答える
0

サイモンの回答は受け入れられており、最良の回答ですが、将来の訪問者のために、Windows アプリケーションの UI 自動化に関する詳細な説明があるこのリンクを提供しています。.

また、Web アプリケーションを自動化する場合は、このリンクに移動することをお勧めします

于 2012-06-21T13:57:40.827 に答える
0

ウィンドウを列挙してから見つけることができます。スクリーンショットでアプリケーションを探索するには、Visual Studio で配布されている Spy++ (spyxx.exe) を使用できます。コードでは、EnumWindowsEnumChildWindowsを使用してすべてのウィンドウまたはすべての子ウィンドウを列挙し、必要なものを見つけます。

于 2012-06-11T06:15:36.193 に答える