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 ツールを使用して、実際にコーディングする前に、これらすべてが可能かどうかを確認できます。