0

管理されていないスタンドアロン アプリケーションに属する必要な Windows コントロールの正しいハンドルを見つけるために、spy++ を使用しました。spy++ の「プロパティ インスペクター」は、このウィンドウには子 (または親) ウィンドウがないことを示していることに注意してください。

次のコードを使用して、ウィンドウの名前を取り戻すこともできました。

   //the invokes are included aswell
    const int WM_GETTEXT = 0x000D;
    static void Main(string[] args)
    {
        IntPtr handle = new IntPtr(Convert.ToInt32("00070818", 16)); 
        int nChars = GetWindowTextLength(handle); //win32 function
        int length = 200;
        StringBuilder sb = new StringBuilder(length);
        SendMessage(handle, WM_GETTEXT, length, sb);
        Console.WriteLine(sb.ToString());           

    }

このウィンドウには、タイトルよりも多くの情報があり、それが WM_GETTEXT で返されるように見えるすべてです (長さの値を 200 に変更しても役に立ちませんでした。いずれにせよ、ロング ショットでした)。

次に、UI オートメーションを使用して別のアプローチを試みました。

static void Main(string[] args)
{
    AutomationElement target = AutomationElement.FromHandle(handle);
    TextPattern textPattern = target.GetCurrentPattern(TextPattern.Pattern) as TextPattern;
}

しかし、私はこのエラーを返しました:

タイプ 'System.InvalidOperationException' の未処理の例外が UIAutomationClient.dll で発生しました

追加情報: サポートされていないパターン。

さらに、Microsoft Inspect.exe も使用してみましたが、UI オートメーションと MSAA モードの両方で、ウィンドウ内のテキストにフォーカスできませんでした。


UI Automationでデータを取得できないということですか?? または、間違ったメソッド/タイプを使用する必要がありますか?

GetWindowText、WM_GETTEXT、または UI オートメーションを使用する以外に、このウィンドウからデータを取得する別の方法はありますか??

私はこのようなことにはかなり慣れていませんが、学ぶために最善を尽くしています。さらに、私は現在リードを持っていないので、役立つコメント/回答は大歓迎です!! 回答する場合は、役立つキーワードを必ず含めてください。そうすれば、あなたのソリューションについて詳しく知ることができます

4

1 に答える 1

2

ラベル (つまり、静的コントロール) とテキスト ボックスは、独自のハンドルを持つ子ウィンドウであるため、Spy++ に表示されます。GetWindowTextターゲット Window に子がない場合は、ラベルまたはテキスト ボックスを使用しておらず、テキスト自体を描画しているため、またはを使用して取得することはできませんWM_GETTEXT

テキストは、スクリーン リーダーで使用される API であるUI オートメーションを通じて公開される場合があります。UISpy.exe または Inspect.exeを使用して、テキストにアクセスできるかどうかを確認します。

于 2013-02-25T00:42:55.680 に答える